Java ogg 转 wav 转换

7
我有以下代码片段:
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默认不支持这些格式,因此我需要像这里描述的那样向我的classpath中添加不同的jars: http://www.javazoom.net/mp3spi/documents.html http://www.javazoom.net/vorbisspi/documents.html 当我尝试转换OGG文件时,代码可以正常运行。但是,当我尝试转换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可以正常工作。
我添加了之前链接中引用的所有jar包,用于OGG转换,除了最新版本的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转换的所有jar包。(看起来好像不是这样。)

1
这是你想要的吗?https://poi1.googlecode.com/files/jogg-0.0.7.jar - longhua
我发现了那个jar包,但是找不到它的Maven依赖项,所以我不想使用它。我尝试从lib文件夹中下载并添加到类路径中,但是没有成功。很抱歉,我浪费了很多时间在这个问题上,我忘记提到这一点了。 - Peter Jaloveczki
1
添加tritonus_jorbis-0.3.6.jar(http://tritonus.org/tritonus_share-0.3.6.jar)可以正确地将OGG转换为WAV。不确定原因。 - longhua
3个回答

3

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

当解码原始的 AudioInputStream 时,AudioSystem 获取所有 SPI 的 FormatConversionProvider 并逐个检查直到找到可用的。因此,类路径的顺序很重要。

检查您的类路径以确保使用了 "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


我尝试过这个,但没有帮助,或者只是无法让它工作。 :( - Peter Jaloveczki
你的库中有哪些JAR文件? - longhua
我将编辑我的问题,你可以在那里看到我的Maven依赖。基本上,我清除了其他所有东西,以便没有任何冲突(例如MP3 SPI)。 - Peter Jaloveczki
1
似乎您的类路径中仍有vorbisspi1.0.2.jar。 它包含一个javax.sound.sampled.spi.FormatConversionProvider,而此FormatConversionProvider无法正常工作。 - longhua
我终于想通了。我把原来的依赖全部删除了。从那时起,我一直遇到类未找到异常错误,直到我正确获取了所有依赖和JAR参考。非常感谢你的帮助! - Peter Jaloveczki
Peter,我一直在努力解决同样的问题。请问您能否分享您的POM?我很好奇您最终是如何解决这个问题的。我的一个项目中有以下jar文件:
  • tritonus_share-0.3.6.jar
  • tritonus_jorbis-0.3.6.jar
  • jogg-0.0.7.jar
  • jorbis-0.0.15.jar
但是在我的maven化项目中似乎不起作用!
- Raff

2
实际上,您可以同时使用mp3spi和vorbisspi。您只需确保Maven将使用正确版本的tritonus-share。如果依赖于Maven的传递依赖机制,则最终会得到tritonus-share 0.3.7-1,该版本缺少org.tritonus.share.sampled.convert.TMatrixFormatConversionProvider类,这就破坏了vorbisspi。
我只需要在我的pom.xml中明确添加对tritonus-share 0.3.7-2的依赖,现在通过Java声音API可以播放ogg和mp3。
有关详细信息,请参见我的博客文章: http://odoepner.wordpress.com/2013/07/19/play-mp3-or-ogg-using-javax-sound-sampled-mp3spi-vorbisspi/

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接