想使用开源的jlayer编个可以单曲循环播放mp3的程序,怎么实现?目前只使用了下面三个类,
javazoom.jl.player.advanced.AdvancedPlayer
javazoom.jl.player.advanced.PlaybackListener
javazoom.jl.player.advanced.PlaybackEvent
javazoom.jl.player.advanced.AdvancedPlayer是主要类,有播放,停止,接受输入流等方法,
javazoom.jl.player.advanced.PlaybackListener是监听器,用于监听javazoom.jl.player.advanced.PlaybackEvent事件,可获得播放开始和播放结束两个事件,并可在监听器提供的两个方法内做相应处理,目前单曲播放可以,可是单曲循环播放怎么实现,弄了好久了,都不行,是否还需要其他的类?jmf可以解决轻松实现循环播放,可是我嫌它麻烦,需要安装,所以想用jlayer来实现。

解决方案 »

  1.   

    package cn.dyc.opensource.jlayer.test;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 JLayerTest {
    public static void main(String[] args) {
    AudioInputStream din = null;
    try {
    File file = new File("f:/download/hyrz-gd.mp3");
    AudioInputStream in = AudioSystem.getAudioInputStream(file); /*
     * 取得音频输入流的格式,将其解码为可用的mp3编码格式
     */
    AudioFormat baseFormat = in.getFormat();
    AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
    baseFormat.getSampleRate(),
    16,
    baseFormat.getChannels(),
    baseFormat.getChannels() * 2,
    baseFormat.getSampleRate(),
    false); /*
     * 使用得到的mp3编码格式,对音频输入流进行解码,得到一个新的可识别的mp3编码格式的音频输入流
     */
    din = AudioSystem.getAudioInputStream(decodedFormat, in);

    /*
     * 连接音频设备,打开数据线路
     */
    DataLine.Info info = new DataLine.Info( SourceDataLine.class,decodedFormat);
    SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);
    if (line != null) {
    line.open(decodedFormat);

    /*
     * 一旦打开线路,我们得实现一个缓冲策略来从输入流挖掘数据到我们的输出线路,即音频设备。
     * 注意,这就像是在写一个复制两个文件的缓冲策略,这个技巧不一定只用在音频传输。
     */
    byte[] data = new byte[4096];                /*
                     * 开始
                     */
    line.start();

    int nBytesRead;
    while ((nBytesRead = din.read(data, 0, data.length)) != -1) {
    line.write(data, 0, nBytesRead);
    } /*
     * 停止
     */
    line.drain();
    line.stop();
    line.close();
    din.close();
    } } catch (Exception e) {
    e.printStackTrace();
    } finally {
    if (din != null) {
    try {
    din.close();
    } catch (IOException e) {
    }
    }
    }
    }
    }
    这是另一种实现播放mp3的方法,可是没实现单曲循环,有高手来指点一下。
    这个方案用到了3个包
    mp3spi1.9.4.jar
    jl1.0.jar
    tritonus_share.jar
      

  2.   


    package cn.dyc.opensource.jlayer.test;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 JLayerTest {
    public static void main(String[] args) {
    AudioInputStream din = null;
    try {
    File file = new File("f:/download/hyrz-gd.mp3");
    AudioInputStream in = AudioSystem.getAudioInputStream(file); /*
     * 取得音频输入流的格式,将其解码为可用的mp3编码格式
     */
    AudioFormat baseFormat = in.getFormat();
    AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
    baseFormat.getSampleRate(),
    16,
    baseFormat.getChannels(),
    baseFormat.getChannels() * 2,
    baseFormat.getSampleRate(),
    false); /*
     * 使用得到的mp3编码格式,对音频输入流进行解码,得到一个新的可识别的mp3编码格式的音频输入流
     */
    din = AudioSystem.getAudioInputStream(decodedFormat, in);

    /*
     * 连接音频设备,打开数据线路
     */
    DataLine.Info info = new DataLine.Info( SourceDataLine.class,decodedFormat);
    SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);
    if (line != null) {
    line.open(decodedFormat);

    /*
     * 一旦打开线路,我们得实现一个缓冲策略来从输入流挖掘数据到我们的输出线路,即音频设备。
     * 注意,这就像是在写一个复制两个文件的缓冲策略,这个技巧不一定只用在音频传输。
     */
    byte[] data = new byte[4096];                /*
                     * 开始
                     */
    line.start();

    int nBytesRead;
    while ((nBytesRead = din.read(data, 0, data.length)) != -1) {
    line.write(data, 0, nBytesRead);
    } /*
     * 停止
     */
    line.drain();
    line.stop();
    line.close();
    din.close();
    } } catch (Exception e) {
    e.printStackTrace();
    } finally {
    if (din != null) {
    try {
    din.close();
    } catch (IOException e) {
    }
    }
    }
    }
    }
    这是另一种实现播放mp3的方法,可是没实现单曲循环,有高手来指点一下。 
    这个方案用到了3个包 
    mp3spi1.9.4.jar 
    jl1.0.jar 
    tritonus_share.jar格式不好看,重新发
      

  3.   

    问题已经解决了。。目的是一次读取mp3文件,循环播放,关键要用到ByteArrayOutputStream和ByteArrayInputStream的reset()方法。