2012-05-06 76 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接口。