首选需要引入依赖:
<dependency>
<groupId>com.googlecode.soundlibs</groupId>
<artifactId>mp3spi</artifactId>
<version>1.9.5.4</version>
</dependency>
再导入以下工具类,就可以开始玩耍了
import java.io.File;
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;
/**
* MP3转PCM Java方式实现
*/
public class ConvertMP32PCM {
/**
* MP3转换PCM文件方法
*
* @param mp3filepath
* 原始文件路径
* @param pcmfilepath
* 转换文件的保存路径
* @throws Exception
*/
public static void convertMP32PCM(String mp3filepath, String pcmfilepath) throws Exception {
AudioInputStream audioInputStream = getPcmAudioInputStream(mp3filepath);
AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, new File(pcmfilepath));
}
/**
* 播放MP3方法
*
* @param mp3filepath
* @throws Exception
*/
public static void playMP3(String mp3filepath) throws Exception {
File mp3 = new File(mp3filepath);
// 播放
int k = 0, length = 8192;
AudioInputStream audioInputStream = getPcmAudioInputStream(mp3filepath);
if (audioInputStream == null)
System.out.println("null audiostream");
AudioFormat targetFormat;
targetFormat = audioInputStream.getFormat();
byte[] data = new byte[length];
DataLine.Info dinfo = new DataLine.Info(SourceDataLine.class, targetFormat);
SourceDataLine line = null;
try {
line = (SourceDataLine) AudioSystem.getLine(dinfo);
line.open(targetFormat);
line.start();
int bytesRead = 0;
byte[] buffer = new byte[length];
while ((bytesRead = audioInputStream.read(buffer, 0, length)) != -1) {
line.write(buffer, 0, bytesRead);
}
audioInputStream.close();
line.stop();
line.close();
} catch (Exception ex) {
ex.printStackTrace();
System.out.println("audio problem " + ex);
}
}
private static 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();
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;
}
//使用mp3输入流转为音频输入流
private AudioInputStream getPcmAudioInputStream(InputStream mp3Stream) {
AudioInputStream audioInputStream = null;
AudioFormat targetFormat = null;
try {
AudioInputStream in = null;
//读取音频文件的类
MpegAudioFileReader mp = new MpegAudioFileReader();
in = mp.getAudioInputStream(mp3Stream);
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;
}
public static void main(String[] args) {
String mp3filepath = "/home/bobxie/temp.mp3";
String pcmfilepath = "/home/bobxie/temp.pcm";
try {
// ConvertMP32PCM.convertMP32PCM(mp3filepath, pcmfilepath);
ConvertMP32PCM.playMP3(mp3filepath);
} catch (Exception e) {
e.printStackTrace();
}
}
}
博客介绍了MP3转PCM的操作,首先要引入相关依赖,接着导入工具类,之后便可进行操作。
2684

被折叠的 条评论
为什么被折叠?



