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包。

<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,下載地址見本文前面的表格。
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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章