2013-03-13 118 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播放器等)。