java播放mp3/ogg/ape/flac音乐
用java sound api播放wav, aiff, au, snd这些格式是jdk原生支持的,本文主要介绍如何播放mp3/ogg/ape/flac音乐。
## 1.先来看一段代码:
```java
import java.io.File;
import java.io.IOException;
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 AudioFilePlayer {
public static void main(String[] args) {
final AudioFilePlayer player = new AudioFilePlayer ();
player.play("E:\\Documents\\Music\\恋人心.mp3");
}
public void play(String filePath) {
final File file = new File(filePath);
try {
final AudioInputStream in = AudioSystem.getAudioInputStream(file);
final AudioFormat outFormat = getOutFormat(in.getFormat());
final DataLine.Info info = new DataLine.Info(SourceDataLine.class, outFormat);
final SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);
if (line != null) {
line.open(outFormat);
line.start();
stream(AudioSystem.getAudioInputStream(outFormat, in), line);
line.drain();
line.stop();
}
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
private AudioFormat getOutFormat(AudioFormat inFormat) {
final int ch = inFormat.getChannels();
final float rate = inFormat.getSampleRate();
return new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, rate, 16, ch, ch * 2, rate, false);
}
private void stream(AudioInputStream in, SourceDataLine line)
throws IOException {
final byte[] buffer = new byte[65536];
for (int n = 0; n != -1; n = in.read(buffer, 0, buffer.length)) {
line.write(buffer, 0, n);
}
}
}
```
是的,你没有看错,代码很简单,就是普通的java sound api,和原来播放wav, aiff, au, snd没什么两样。但是光这样是运行不起来的,还需要一些额外的jar包来支持。
## 2.相关jar包介绍
| 包名 | 描述 | 支持格式 |
| --- | --- | --- |
| jorbis | Vorbis解码器 | ogg |
| VorbisSPI | 支持OGG Vorbis格式的SPI封装器 | |
| JLayer | MP3解码器 | mp3 |
| MP3SPI | mp3的SPI | |
| jflac | flac解码器和SPI | flac |
| jspeex | speex解码器和SPI | spx |
| jmac | Monkey's Audio解码器和SPI | ape,mac |
| tritonus_share | tritonus底层库 | |
| jtta | tta解码器和SPI | tta |
| libkj-java | 可用来绘制音乐播放时的频谱分析 | |
| jaudiotagger | 音乐标签读取库 | |
| jlGui | 音乐播放器 | |
| yoyoplayer | 音乐播放器 | |
| musique | 音乐播放器 | . |
其中,如果要支持mp3的话,需要javalayer,mp3spi,tritonus_share这3个jar包。
而ogg需要jorbis,vorbisspi,tritonus_share这3个jar包。
ape需要jmac这个jar包。
flac需要jflac这个jar包。
链接:[http://pan.baidu.com/s/1dFe7lh3](http://pan.baidu.com/s/1dFe7lh3) 密码:0uaw
## 3.maven
如果用maven的话,加入以下dependency就有ogg和mp3的支持了。另外两个ape和flac我还没找到,可能要手工自己编译或者去前面的链接下载编译好的jar包。
```
<dependency>
<groupId>com.googlecode.soundlibs</groupId>
<artifactId>tritonus-share</artifactId>
<version>0.3.7-2</version>
</dependency>
<dependency>
<groupId>com.googlecode.soundlibs</groupId>
<artifactId>mp3spi</artifactId>
<version>1.9.5-1</version>
</dependency>
<dependency>
<groupId>com.googlecode.soundlibs</groupId>
<artifactId>vorbisspi</artifactId>
<version>1.0.3-1</version>
</dependency>
```
## 4\. musique
推荐下载musique,[http://tulskiy.github.io/musique/](http://tulskiy.github.io/musique/)。
还有一个基于musique的高仿酷狗的播放器,效果还不错:[下载](https://github.com/zhangliangming/HappyPlayer-PC-musique)
musique把以上一些项目的源码全部综合,还自带所有声音文件供测试。
编译方法也是用maven,然后最后会生成musique-core-0.3-SNAPSHOT.jar,双击运行就是一个音乐播放器。它相对jlGui和yoyoplayer的一个优点就是ogg/ape/flac格式全都支持拖进度条任意时间点播放。
附件有我编译好的musique,供不愿编译的懒人下载使用。
## 5.原理
可以看到,用java播放mp3/ogg/ape/flac音乐没什么难,因为别人都给封装好了。其实这还要归功于java sound api的开放性架构,如果有新的音乐格式,只需要实现新的SPI就可以了。而对用户来说,不必关心这些,代码依旧不变。
## 6.名词解释
如果深入学习java sound api的话,那就要懂一些术语了,这里记录若干名词。
英文中文解释
| 英文 | 中文 | 解释 |
| --- | --- | --- |
| mixer | 混频器 | 可以把多个声音混到一起播放 |
| reverb | 混响 | 提供回声效果 |
| gain | 增益 | 放大声音 |
| pan | 声像平衡 | 左声道右声道调节 |
| equalizer | 均衡器 | 10个频段调节,展现不同音效 |
| sequencer | 音序器 | 回放MIDI用 |
| synthesizer | 合成器 | 合成音符,由不同的乐器播放 |