Java播放mp3和ogg

5
经过数小时的搜索和阅读大量源代码后,我陷入了僵局,需要您的帮助。正如标题所示,我正在尝试用Java构建(又一个)音乐播放器。我偶然发现了Javazoom项目,它有点有效,但也有点无效。我的目标是能够播放mp3和ogg文件。播放mp3没有问题:我可以获取所有信息(ID3标签和一般音频文件信息),并且我可以执行所有必要的操作(播放、暂停、恢复、搜索等)。但是当我尝试播放ogg文件时,我只能得到其中之一,要么我可以播放文件但无法获得任何文件信息,要么我可以获取所有信息但无法播放文件。我的代码基本上是BasicPlayer类的改进版本,我试图查看jlGui播放器的代码,以了解它如何与所有格式兼容,但我在那段代码中完全迷失了方向。

我的MediaPlayer代码

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

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添加到classpath中时,它会播放ogg文件,但不显示任何信息。

所以...我很困惑,真的需要帮助。

4个回答

0

0

不幸的是,jogg的javax.sound.sampled实现存在一些缺陷。 也许你想试试FFsampledSP。它是一个基于FFmpeg的实现,适用于Win和OSX,同时也实现了javax.sound.sampled接口。


0

0

你的问题源于假设播放器实现也会为流提供元数据。不幸的是,许多实现并没有旨在提供元数据。

我建议将检索元数据与播放分开,然后您可以使用不同的库来访问元数据。然后,您可以使用专门用于元数据操作的库独立解决此问题,而不必考虑文件的播放。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接