Java ogg转wav

时间:2013-03-13 13:57:52

标签: java audio wav javasound ogg

我有以下代码段:

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));

我编写了这段代码,用于将MP3和OGG文件转换为WAV文件。据我所知,java默认不支持这些格式,所以我必须在我的类路径中添加不同的jar,如下所述:

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

现在只有在获取解码后的输入流时才抛出此值,这意味着ogg文件已成功解析。

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转换工作的所有罐子。 (看起来不是。)

3 个答案:

答案 0 :(得分: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中指定classpath顺序,请查看以下帖子:Maven classpath order issues

答案 1 :(得分: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/

答案 2 :(得分:0)

您可能想尝试FFsampledSPSampledSP的一部分)。

这是一个基于FFmpeg的Win和OSX实现,它实现了javax.sound.sampled接口。支持OGG,FLAC等。它与其他FFmpeg应用程序(如VLC播放器和其他许多应用程序)中使用的解码器基本相同。