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

概要:

本文主要介绍如何播放mp3/ogg/ape/flac音乐

| |目录

 
用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("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包介绍

包名描述支持格式
jorbisVorbis解码器ogg
VorbisSPI支持OGG Vorbis格式的SPI封装器
JLayerMP3解码器mp3
MP3SPImp3的SPI
jflacflac解码器和SPIflac
jspeexspeex解码器和SPIspx
jmacMonkey's Audio解码器和SPIape,mac
tritonus_sharetritonus底层库
jttatta解码器和SPItta
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 密码: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/。 

还有一个基于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合成器合成音符,由不同的乐器播放


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
资料加载中...
已关注 , 取消