java播放mp3/ogg/ape/flac音乐

好吧,又要说一句了,java真是无所不能。
用java sound api播放wav, aiff, au, snd文件想必大家都已经知道了,这些格式是jdk原生支持的。
本文将介绍如何播放mp3/ogg/ape/flac音乐。其实都是批发来的,我只是搬运工 Σ( ° △ °|||)︴

1. 先上代码


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("D:/xiaomi.ogg");
//player.play("D:/01 - 謎解きはディナーのあとで.mp3");
//player.play("D:/周杰伦-青花瓷.APE");
//player.play("D:/周杰伦 - 听妈妈的话.flac");
}

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包介绍
[table]
|id|最新版本|描述|支持格式
|[url=http://www.jcraft.com/jorbis/]jorbis[/url]|0.0.17|Vorbis解码器|ogg|
|[url=http://www.javazoom.net/vorbisspi/vorbisspi.html]VorbisSPI[/url]|1.0.3|支持OGG Vorbis格式的SPI封装器||
|[url=http://www.javazoom.net/javalayer/javalayer.html]JLayer[/url]|1.0.1|MP3解码器|mp3|
|[url=http://www.javazoom.net/mp3spi/mp3spi.html]MP3SPI[/url]|1.9.5|mp3的SPI||
|[url=http://jflac.sourceforge.net/]jflac[/url]|1.3|flac解码器和SPI|flac|
|[url=http://sourceforge.net/projects/jspeex/files/jspeex/]jspeex[/url]|0.9.7|speex解码器和SPI|spx|
|[url=http://jmac.sourceforge.net/]jmac[/url]|1.7.4|Monkey's Audio解码器和SPI|ape,mac|
|[url=http://www.tritonus.org/plugins.html]tritonus_share[/url]|0.3.6|tritonus底层库||
|[url=https://github.com/tulskiy/jtta]jtta[/url]|1.0|tta解码器和SPI|tta|
|[url=https://code.google.com/p/libkj-java/]libkj-java[/url]||dsp,可用来绘制音乐播放时的频谱分析||
|[url=http://www.jthink.net/jaudiotagger/index.jsp]jaudiotagger[/url]|2.2.2|音乐标签读取库||
|[url=http://www.javazoom.net/jlgui/jlgui.html]jlGui[/url]|3.1|音乐播放器||
|[url=https://code.google.com/p/yoyoplayer/]yoyoplayer[/url]|1.3|音乐播放器||
|[url=https://github.com/tulskiy/musique]musique[/url]||音乐播放器||
[/table]

其中,如果要支持mp3的话,需要javalayer,mp3spi,tritonus_share这3个jar包。
而ogg需要jorbis,vorbisspi,tritonus_share这3个jar包。
ape需要jmac这个jar包。
flac需要jflac这个jar包。

3.maven
如果用maven的话,加入以下dependency就有ogg和mp3的支持了。另外两个ape和flac我还没找到,可能要手工自己编译或者去前面的链接下载编译好的jar包。


com.googlecode.soundlibs
tritonus-share
0.3.7-2


com.googlecode.soundlibs
mp3spi
1.9.5-1


com.googlecode.soundlibs
vorbisspi
1.0.3-1



4. musique
最后我强烈推荐下载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的话,那就要懂一些术语了,这里记录若干名词。
[table]
|英文|中文|本人自己的简单外行解释|
|mixer|混频器|可以把多个声音混到一起播放|
|reverb|混响|提供回声效果|
|gain|增益|放大声音|
|pan|声像平衡|左声道右声道调节,就是可以控制左右两个耳机或两个喇叭哪个出声音|
|equalizer|均衡器|10个频段调节,展现不同音效。一般音乐播放器都有|
|sequencer|音序器|回放MIDI用|
|synthesizer|合成器|合成音符,由不同的乐器播放|
[/table]

7.参考资料
[url=http://tech.163.com/tm/030531/030531_95896.html]Java实现音频播放--JavaSound API编写音频处理程序[/url]

你可能感兴趣的:(游戏)