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包介绍
id 最新版本 描述 支持格式
jorbis 0.0.17 Vorbis解码器 ogg
VorbisSPI 1.0.3 支持OGG Vorbis格式的SPI封装器
JLayer 1.0.1 MP3解码器 mp3
MP3SPI 1.9.5 mp3的SPI
jflac 1.3 flac解码器和SPI flac
jspeex 0.9.7 speex解码器和SPI spx
jmac 1.7.4 Monkey's Audio解码器和SPI ape,mac
tritonus_share 0.3.6 tritonus底层库
jtta 1.0 tta解码器和SPI tta
libkj-java dsp,可用来绘制音乐播放时的频谱分析
jaudiotagger 2.2.2 音乐标签读取库
jlGui 3.1 音乐播放器
yoyoplayer 1.3 音乐播放器
musique 音乐播放器


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


7.参考资料
Java实现音频播放--JavaSound API编写音频处理程序

你可能感兴趣的:(音乐)