Java播放mp3和ogg

时间:2012-05-06 11:56:48

标签: java mp3 ogg

经过无数个小时的搜索和阅读大量的源代码,我已经走到了尽头,我需要你的帮助。 正如标题所示,我正在尝试用Java构建(又一个)音乐播放器。我偶然发现了Javazoom project它有点起作用,但它也有点不行。我的目标是能够播放mp3和ogg文件。播放mp3可以正常工作:我可以获取所有信息(ID3标签和一般音频文件信息),我可以执行所有需要的操作(播放,暂停,恢复,搜索等)。但是当我尝试播放ogg文件时,我只能获得两个中的一个,要么我可以播放文件但是没有获取文件信息,或者我获取所有信息但无法播放文件。我的代码基本上是BasicPlayer类的改进版本,我试着通过jlGui播放器查看它如何设法与所有格式兼容,但我完全迷失在该代码中。

My MediaPlayer code

这是我用来编译程序的命令:

javac -cp lib\jl1.0.1.jar;lib\jogg-0.0.7.jar;lib\jorbis-0.0.15.jar;liblog4j-1.2.16.jar;lib\mp3spi1.9.5.jar;lib\tritonus_share-0.3.6.jar;libvorbisspi1.0.3.jar MediaPlayer.java

当我用

执行它时
java -cp .;lib\jl1.0.1.jar;lib\jogg-0.0.7.jar;lib\jorbis-0.0.15.jar;liblog4j-1.2.16.jar;lib\mp3spi1.9.5.jar;libtritonus_jorbis-0.3.6.jar;libtritonus_share-0.3.6.jar;libvorbisspi1.0.3.jar MediaPlayer d:/foo.mp3

它显示信息并播放文件就好了,但是当我为d:/foo.ogg尝试相同时我得到一个例外:

167 [main] DEBUG MediaPlayer  - Target format: PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian
Exception in thread "main" java.lang.RuntimeException: Error initializing stream: java.lang.IllegalArgumentException: Unsupported conversion: PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian from VORBISENC 48000.0 Hz, unknown bits per sample, stereo, 1 bytes/frame, 16000.0 frames/second,
    at MediaPlayer.initAudioStream(MediaPlayer.java:302)
    at MediaPlayer.open(MediaPlayer.java:663)
    at MediaPlayer.main(MediaPlayer.java:772)

但是当我接着注释第262行(initAudioStream()中的createLine()调用并使用相同的命令运行它时,它会显示所有文件信息,但会引发类似的异常

170 [main] DEBUG MediaPlayer  - Target format: PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian
Exception in thread "main" java.lang.IllegalArgumentException: Unsupported conversion: PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian from VORBISENC 48000.0 Hz, unknown bits per sample, stereo, 1 bytes/frame, 16000.0 frames/second,
    at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
    at MediaPlayer.createLine(MediaPlayer.java:362)
    at MediaPlayer.initLine(MediaPlayer.java:392)
    at MediaPlayer.startPlayback(MediaPlayer.java:483)
    at MediaPlayer.play(MediaPlayer.java:672)
    at MediaPlayer.main(MediaPlayer.java:773)

然后当我将lib \ tritonus_jorbis-0.3.6.jar添加到类路径时,它会播放ogg文件但不显示任何信息。

所以是的......我很难过,真的可以帮忙。

4 个答案:

答案 0 :(得分:0)

您的问题源于假设播放器实现还将为流提供元数据。不幸的是,许多实现从未使用提供元数据的goeal。

我会分开从播放中检索元数据,然后您可以使用不同的库来访问元数据。然后,您可以使用library specialized in metadata manipluation独立于播放文件来解决此问题。

答案 1 :(得分:0)

答案 2 :(得分:0)

不幸的是,jogg的javax.sound.sampled实现有一些缺点。 也许你想给FFsampledSP一个机会。它是基于FFmpeg的Win和OSX实现,它还实现了javax.sound.sampled接口。

答案 3 :(得分:0)

我有类似的问题,使用mp3spi 1.9.5-1和vorbisspi 1.0.3-1。我不得不将tritonus-share 0.3.7-2而不是0.3.7-1放入类路径中,否则vorbisspi将无效。

我使用了Maven依赖项。完整的工作解决方案在这里: http://odoepner.wordpress.com/2013/07/19/play-mp3-or-ogg-using-javax-sound-sampled-mp3spi-vorbisspi/

相关问题