2013-03-13 94 views
6

我有下面的代碼片段:Java的OGG格式爲WAV轉換

File file = new File(sourceFile); 
AudioInputStream in = AudioSystem.getAudioInputStream(file); 
AudioInputStream din = null; 
AudioFormat baseFormat = in.getFormat(); 

AudioFormat decodedFormat = new AudioFormat(
       AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(), 
       16, baseFormat.getChannels(), baseFormat.getChannels() * 2, 
       baseFormat.getSampleRate(), false); 

din = AudioSystem.getAudioInputStream(decodedFormat, in); 
AudioSystem.write(din, AudioFileFormat.Type.WAVE, new File(targetFile)); 

我寫了這個代碼transfrom MP3和OGG文件爲WAV文件。這些格式在Java默認情況下,按照我的理解,不支持,所以我不得不不同的罐子添加到我的類路徑如下所述:

http://www.javazoom.net/mp3spi/documents.html

http://www.javazoom.net/vorbisspi/documents.html

的代碼運行正常,當我轉換MP3文件。但是,當我嘗試轉換OGG文件,我得到以下錯誤:

java.lang.IllegalArgumentException: Unsupported conversion: PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian from VORBISENC 44100.0 Hz, unknown bits per sample, stereo, 1 bytes/frame, 16000.0 frames/second 

現在這只是拋出時得到的解碼的InputStream本身,這意味着OGG文件successfuly解析。

AudioSystem.getTargetEncodings(sourceFormat) 

上面的代碼在處理MP3或OGG文件時不會返回任何值。唯一的區別是,MP3工作正常。

我添加了ogg轉換所需的上一個鏈接引用的所有jar,除了最新版本的jogg-0.0.7.jar,因爲我找不到它。

我嘗試了不同的解決方案,像JAVE,但我需要它在MAC上運行,並且JAVE不會在沒有特殊實現的情況下在MAC上運行。

有沒有人有任何建議可能會導致問題?可能有任何解決方法將OGG文件轉換爲WAV?

編輯:

噢哇我意識到這個問題是什麼...手動閱讀寄託都後,我才知道,使用兩種不同類型的SPI(如在這種情況下,MP3和OGG)可引起問題。我刪除了對MP3 spi maven的依賴,並且錯誤消失了。認爲結果wav基本上是空的。對此有何建議?如果我能將OGG轉換爲WAV轉換工作,我會很高興,但我可以用另一種方式轉換MP3。

我的POM依賴看起來是這樣的:

<dependency> 
    <groupId>com.googlecode.soundlibs</groupId> 
    <artifactId>vorbisspi</artifactId> 
    <version>1.0.3-1</version> 
</dependency> 

此下載我想我需要做OGG轉換工作全部罐子。 (看起來不是。)

+1

這是你想要的嗎? https://poi1.googlecode.com/files/jogg-0.0.7.jar – longhua 2013-03-13 14:16:29

+0

我發現那個jar我找不到它的maven依賴項,所以我不想使用它。我試圖將它從lib文件夾添加到classpath,但沒有bueno。 Sry我一直在浪費很多時間,我忘記了這個問題。 – 2013-03-13 14:26:29

+1

添加tritonus_jorbis-0.3.6.jar(http://tritonus.org/tritonus_share-0.3.6.jar)可以正確地將OGG轉換爲WAV。不知道爲什麼。 – longhua 2013-03-13 15:10:13

回答

2

使用tritonus_jorbis-0.3.6.jar替換vorbisspi1.0.2.jar。

解碼原始AudioInputStream時,AudioSystem獲取所有SPI的FormatConversionProvider並逐個檢查,直到找到一個可以工作的。所以classpath的順序很重要。

檢查您的類路徑以確保使用「org.tritonus.sampled.convert.jorbis.JorbisFormatConversionProvider」。檢查類路徑中的每個JAR;搜索其中的以下文件。或者在類路徑的最開始處放置tritonus_jorbis-0.3.6.jar。

META-INF\services\javax.sound.sampled.spi.FormatConversionProvider 

關於如何在Maven中指定的類路徑順序,檢查這個帖子:Maven classpath order issues

+0

我試過了,它沒有幫助,或者只是無法讓它工作。 :( – 2013-03-13 15:38:04

+0

你在圖書館裏有什麼JAR? – longhua 2013-03-13 15:40:50

+0

我會編輯我的問題,你可以看到我的maven依賴關係,我基本上清除了所有其他的東西,所以沒有任何東西可以與任何東西衝突(如mp3 spi) – 2013-03-13 15:43:39

1

其實,你可以同時使用mp3spi和vorbisspi。您只需確保Maven將使用正確版本的tritonus-share。如果你依賴Maven的傳遞依賴機制,你最終會得到tritonus-share 0.3.7-1,它缺少類org.tritonus.share.sampled.convert.TMatrixFormatConversionProvider。這是什麼打破了vorbisspi。

我只是明確地添加了對tritonus-share 0.3.7-2的依賴關係到我的pom.xml,現在ogg和mp3播放都可以通過Java聲音API工作。

請參見我的博客文章詳細內容: http://odoepner.wordpress.com/2013/07/19/play-mp3-or-ogg-using-javax-sound-sampled-mp3spi-vorbisspi/

0

你可能想嘗試FFsampledSP(的SampledSP一部分)。

這是一個基於FFmpeg的Win和OSX實現,實現了javax.sound.sampled接口。 OGG,FLAC等支持。它與其他FFmpeg應用程序中使用的解碼器基本相同(如VLC播放器等)。