JavaSound一个小的低层应用程序接口(API),它支持数字音频和乐器数字接口(MIDI)记录和回放数据。在JDK 1.3.0之前,JavaSound是标准的Java扩展API,但从Java 2的1.3.0版开始,JavaSound就被包含到JDK之中。由于Java基于跨平台(操作系统、硬件平台)的特点JavaSound在任何情况下都可以实现音频处理程序Java 1.3以上版本的系统运行,无需安装任何支持软件。 使用JavaSound API,可以实现各种基于声音的应用,例如声音录制、音乐播放、网络电话、音乐编辑等。JavaSound API各种解码和合成器SPI(服务提供者接口,Service Provider Interface)为基础,实现各种音乐格式的解码与转码。 对于来自各种音频输入端口的信号,如麦克风,CD它们可以到达播放器、磁带播放器等TargetDataLine在使用混频器控制输入混频之前,最后通过程序TargetDataLine获取数字音频输入流。 类似地,混频器用于处理输出音频时的一系列来源SourceDataLine混频处理的信号可以输出到扬声器、耳机等各种输出端口。SourceDataLine它是一种可以写入音频信号数字流的设备,例如,我们可以从一个WAV文件读取内容写入SourceDataLine,然后通过扬声器输出。我们可以想SourceDataLine它是一个虚拟播放器,只要扬声器和耳机连接在电脑上,音频信号就会通过SourceDataLine进行播放。
但是,JavaSound只支持wav等格式音频缺乏正确的音频MP支持3格式音频文件,想要使用Java代码播放MP需要第三方库。JLayer-MP3 library是一款Java语言编写的开源MP3解码器库(jl1.0.jar),又称为javazoom.jl包。为了支持mp我们必须添加3的播放mp3的SPI支持库(已包含)JLayer-MP3 library)在当前项目中。mp3的SPI有三个支持库Jar文件jl1.0.jar、mp3spi1.9.4.jar、tritonus_share.jar。
为了让Java可同时播放程序MP3格式和WAV等格式的音频,需要如图在当前项目的构建文件中添加mp3的SPI支持库:
以下是一个简单的播放例程,可兼容播放MP3和WAV音频,MP3 其实音频是转码的WAV格式了。
import java.io.File; 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; public class AudioPlayTest { private AudioInputStream audioStream; private AudioFormat audioFormat; private SourceDataLine sourceDataLine; public AudioPlayTest(String path) { playMusic(path); } private void playMusic(String path){ try{ int count; byte buf[] = new byte[2048]; //获取音频输入流 audioStream = AudioSystem.getAudioInputStream(new File(path)); //获取音频格式 audioFormat = audioStream.getFormat(); System.out.println("音频文件: " path); System.out.println("音频Encoding: " audioFormat.getEncoding()); //如果不是wav格式,转换mp3文件编码。MPEG1L3(mp3格式)转为PCM_SIGNED(wav格式) if (audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) { audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, audioFormat.getSampleRate(), 16, audioFormat .getChannels(), audioFormat.getChannels() * 2, audioFormat.getSampleRate(), false); audioStream = AudioSystem.getAudioInputStream(audioFormat, audioStream); } //转换mp文件编码结束 //包装音频信息 DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, audioFormat,AudioSystem.NOT_SPECIFIED); //获取虚拟扬声器(SourceDataLine)实例 sourceDataLine = (SourceDataLine)AudioSystem.getLine(dataLineInfo); sourceDataLine.open(audioFormat); sourceDataLine.start(); //播放音频 while((count = audioStream.read(buf,0,buf.length)) != -1){ sourceDataLine.write(buf,0,count); } ///播放结束,释放资源 sourceDataLine.drain(); sourceDataLine.close(); audioStream.close(); }catch(Exception ex){ ex.printStackTrace(); } } public static void main(String[] args) { String path = "D:\\test\\三步舞曲.mp3"; new AudioPlayTest(path); path = "D:\\test\\我是一片云.wav"; new AudioPlayTest(path); } }
其实这个程序只是在"使用Java播放wav音乐"博客的第二个计划程序增加了一点MP3格式音频的转码处理。请参见: 使用Java播放wav音乐_Java博客编程公园-CSDN博客
本例程的源代码及相关mp3的SPI支持库