使用java播放mp3的LineUnavailableException

我的目标是从Java播放mp3文件。 对于我采用的每种方法,它总是因LineUnavailableException失败。

  AudioInputStream inputStream = AudioSystem.getAudioInputStream(new URL("http://localhost:8080/agriserver/facebook/sound/test6.mp3")); Clip clip = AudioSystem.getClip(info); clip.open(inputStream); clip.start(); 

尝试修复它失败:

  • 使用Sun的mp3插件。
  • 使用Jlayer第三方库
  • 使用Tritonus第三方库
  • 使用Sony Sound Forge,Adobe Sound Booth重新编码mp3,一切都没有运气
  • 使用不同的编码率和采样率重新编码mp3
  • 尝试使用JMF
  • 使用来自互联网的随机mp3,在其他应用程序中可以正常播放
  • 阅读具有相同错误的post。 所有post都没有帮助解决问题的答案。

这是例外:

线程“main”中的exceptionjavax.sound.sampled.LineUnavailableException:格式为MPEG1L3 48000.0 Hz的行,每个样本未知位,立体声,未知帧大小,41.666668帧/秒,不支持。
     at com.sun.media.sound.DirectAudioDevice $ DirectDL.implOpen(DirectAudioDevice.java:494)
     at com.sun.media.sound.DirectAudioDevice $ DirectClip.implOpen(DirectAudioDevice.java:1280)
    在com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:107)
    在com.sun.media.sound.DirectAudioDevice $ DirectClip.open(DirectAudioDevice.java:1061)
    在com.sun.media.sound.DirectAudioDevice $ DirectClip.open(DirectAudioDevice.java:1151)
    在Demo.playMp3(Demo.java:83)

显然,mp3必须被读入一个流。 必须将该流读入第二个流以对其进行解码。 以下代码有效:

  // read the file AudioInputStream rawInput = AudioSystem.getAudioInputStream(new ByteArrayInputStream(data)); // decode mp3 AudioFormat baseFormat = rawInput.getFormat(); AudioFormat decodedFormat = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, // Encoding to use baseFormat.getSampleRate(), // sample rate (same as base format) 16, // sample size in bits (thx to Javazoom) baseFormat.getChannels(), // # of Channels baseFormat.getChannels()*2, // Frame Size baseFormat.getSampleRate(), // Frame Rate false // Big Endian ); AudioInputStream decodedInput = AudioSystem.getAudioInputStream(decodedFormat, rawInput); 

好的 – 让我们首先排除你的MP3文件和你的代码。

  1. 选择您拥有的MP3文件并使用任何MP3播放器播放。
  2. 下载http://www.javazoom.net/javalayer/sources/jlayer1.0.1.zip
  3. 从zip文件中提取jl1.0.1.jar并放入类路径
  4. 将本答案末尾的代码剪切并粘贴到您的开发环境中。
  5. 编译并运行以确保步骤1中的mp3文件是文件的参数。 (在我的情况下,我有这个“C:\\用户\\ romain \\音乐\\ Al DiMeola \\优雅的吉普赛\ \ 01飞越Rio Al DiMeola.mp3”)
  6. 我测试了它,它工作正常。

     import java.io.BufferedInputStream; import java.io.FileInputStream; import javazoom.jl.player.Player; public class MP3 { private String filename; private Player player; // constructor that takes the name of an MP3 file public MP3(String filename) { this.filename = filename; } public void close() { if (player != null) player.close(); } // play the MP3 file to the sound card public void play() { try { FileInputStream fis = new FileInputStream(filename); BufferedInputStream bis = new BufferedInputStream(fis); player = new Player(bis); } catch (Exception e) { System.out.println("Problem playing file " + filename); System.out.println(e); } // run in new thread to play in background new Thread() { public void run() { try { player.play(); } catch (Exception e) { System.out.println(e); } } }.start(); } // test client public static void main(String[] args) { String filename = args[0]; MP3 mp3 = new MP3(filename); mp3.play(); } 

    }