2012-05-06 73 views
5

经过无数个小时的搜索和阅读大量源代码后,我处于一个死胡同,我需要你的帮助。正如标题所示,我正试图在Java中构建(又一个)音乐播放器。我偶然发现了Javazoom project,它有点不错,但它也有点不对。我的目标是能够播放mp3和ogg文件。播放MP3可以毫无问题地工作:我可以获取所有信息(ID3标签和一般音频文件信息),并且可以执行所有需要的操作(播放,暂停,恢复,搜索等)。但是当我尝试播放ogg文件时,我只能得到其中的一个,或者我可以播放该文件,但不会获取文件信息,或者获取所有信息但无法播放该文件。我的代码基本上是BasicPlayer类的改进版本,我尝试通过jlGui播放器查看它如何管理与所有格式兼容,但我完全迷失在该代码中。Java播放MP3和ogg

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文件的类路径中,但不显示任何信息。

所以是的......我很难过,可以真正使用一些帮助。

回答

0

你的问题源于玩家实现也会为流提供元数据的假设。不幸的是,许多实现从未与提供元数据的Goeal一起实现。

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

0

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