Java工具类之音频播放与mp3转pcm-yellowcong
2018-01-14 22:20
453 查看
今天玩百度的api,我不知道为啥,就是识别不了俺的mp3,俺就怒了,啥JB破玩意,连个mp3都识别不了,还搞毛线,后来发现mp3的音频包含文件头描述啥的,而pcm的音频格式就纯音频了,没有文件头信息,百度的语音识别不支持mp3的,所以,我需要一个工具类,将mp3格式的音频转化为pcm的,这样我就可以玩语音识别了。
测试的播放音频,我就不能截图了,截图截不出来声音啊,但是转化的图片如下,大家可以瞅一眼。
依赖jar包
<dependency> <groupId>com.googlecode.soundlibs</groupId> <artifactId>mp3spi</artifactId> <version>1.9.5.4</version> </dependency>
工具代码
package com.yellowcong.baidu.utils; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.OutputStream; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import javax.sound.sampled.SourceDataLine; import javazoom.spi.mpeg.sampled.file.MpegAudioFileReader; /** * 创建日期:2018年1月14日 * 创建时间:下午10:09:39 * 创建者 :yellowcong * 机能概要:MP3转PCM Java方式实现 * http://ai.baidu.com/forum/topic/show/496972 */ public class AudioUtils { private static AudioUtils audioUtils = null; private AudioUtils(){} //双判断,解决单利问题 public static AudioUtils getInstance(){ if(audioUtils == null){ synchronized (AudioUtils.class) { if(audioUtils == null){ audioUtils = new AudioUtils(); } } } return audioUtils; } /** * MP3转换PCM文件方法 * * @param mp3filepath 原始文件路径 * @param pcmfilepath 转换文件的保存路径 * @return * @throws Exception */ public boolean convertMP32Pcm(String mp3filepath, String pcmfilepath){ try { //获取文件的音频流,pcm的格式 AudioInputStream audioInputStream = getPcmAudioInputStream(mp3filepath); //将音频转化为 pcm的格式保存下来 AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, new File(pcmfilepath)); return true; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } } /** * 播放MP3方法 * * @param mp3filepath * @throws Exception */ public void playMP3(String mp3filepath) throws Exception { //获取音频为pcm的格式 AudioInputStream audioInputStream = getPcmAudioInputStream(mp3filepath); // 播放 if (audioInputStream == null){ System.out.println("null audiostream"); return; } //获取音频的格式 AudioFormat targetFormat = audioInputStream.getFormat(); DataLine.Info dinfo = new DataLine.Info(SourceDataLine.class, targetFormat, AudioSystem.NOT_SPECIFIED); //输出设备 SourceDataLine line = null; try { line = (SourceDataLine) AudioSystem.getLine(dinfo); line.open(targetFormat); line.start(); int len = -1; // byte[] buffer = new byte[8192]; byte[] buffer = new byte[1024]; //读取音频文件 while ((len = audioInputStream.read(buffer)) > 0) { //输出音频文件 line.write(buffer, 0, len); } // Block等待临时数据被输出为空 line.drain(); //关闭读取流 audioInputStream.close(); //停止播放 line.stop(); line.close(); } catch (Exception ex) { ex.printStackTrace(); System.out.println("audio problem " + ex); } } /** * 创建日期:2018年1月14日<br/> * 创建时间:下午9:53:14<br/> * 创建用户:yellowcong<br/> * 机能概要:获取文件的音频流 * @param mp3filepath * @return */ private AudioInputStream getPcmAudioInputStream(String mp3filepath) { File mp3 = new File(mp3filepath); AudioInputStream audioInputStream = null; AudioFormat targetFormat = null; try { AudioInputStream in = null; //读取音频文件的类 MpegAudioFileReader mp = new MpegAudioFileReader(); in = mp.getAudioInputStream(mp3); AudioFormat baseFormat = in.getFormat(); //设定输出格式为pcm格式的音频文件 targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(), 16, baseFormat.getChannels(), baseFormat.getChannels() * 2, baseFormat.getSampleRate(), false); //输出到音频 audioInputStream = AudioSystem.getAudioInputStream(targetFormat, in); } catch (Exception e) { e.printStackTrace(); } return audioInputStream; } }
测试代码
package yellowcong.yuyin; import org.junit.Test; import com.yellowcong.baidu.utils.AudioUtils; /** * 创建日期:2018年1月14日 * 创建时间:下午10:09:39 * 创建者 :yellowcong * 机能概要:MP3转PCM Java方式实现 */ public class TestAudioUtils { //测试播放音频 @Test public void testPaly() throws Exception{ AudioUtils utils = AudioUtils.getInstance(); utils.playMP3("D:/xx.mp3"); } @Test public void testConvert() throws Exception{ AudioUtils utils = AudioUtils.getInstance(); utils.convertMP32Pcm("D:/xx.mp3", "D:/xx.pcm"); } }
测试的播放音频,我就不能截图了,截图截不出来声音啊,但是转化的图片如下,大家可以瞅一眼。
参考文章
http://ai.baidu.com/forum/topic/show/496972相关文章推荐
- java 层 用 AudioTrack 播放 pcm 格式的音频文件
- Java获取音频文件(MP3)的播放时长
- java利用ffmpeg将amr格式转化成mp3后无法播放音频
- fedora18自带的video视频播放器不能播放视频(rmvb和avi)和音频(mp3)
- 音频(三) - 录制播放PCM音频流和WMV音频文件
- 音频队列Audioqueue播放pcm文件
- java applet播放音频(au,mid)
- [置顶] 《android多媒体api》之AudioTrack原始音频pcm播放api
- java播放MP3/APE音乐文件
- win mobile 5播放mp3音乐的方法(3)--pcm码流播放篇
- Ehome:智能家居之多媒体系统mp3音频播放
- iOS 最简单的OpenAL播放PCM实时音频
- win mobile 5播放mp3音乐的方法(3)--pcm码流播放篇
- C#里面用API完成MP3等音频文件地播放类
- 更新一下SimplePlayer播放mp3的java类!
- 基于JMF下的Java的MP3播放
- 用Java实现音频播放
- Java如何播放音频文件,4行代码帮你搞定(不,1行)!
- 音频播放工具类
- win mobile 5播放mp3音乐的方法(3)--pcm码流播放篇