【问题标题】:Java ogg to wav conversionJava ogg 到 wav 的转换
【发布时间】:2013-03-13 13:57:52
【问题描述】:

我有以下代码sn-p:

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 转换工作的所有罐子。 (好像没有。)

【问题讨论】:

  • 这是你想要的吗? poi1.googlecode.com/files/jogg-0.0.7.jar
  • 我发现 jar 只是找不到它的 maven 依赖项,所以我不想使用它。我试图将它从 lib 文件夹中添加到类路径中,但没有 bueno。抱歉,我在这个问题上浪费了很多时间,我忘了提及这一点。
  • 添加tritonus_jorbis-0.3.6.jar (tritonus.org/tritonus_share-0.3.6.jar) 可以将OGG正确转换为WAV。不知道为什么。

标签: java audio wav javasound ogg


【解决方案1】:

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

AudioSystem在解码原始AudioInputStream时,获取所有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

【讨论】:

  • 我试过了,它没有帮助,或者只是无法让它工作。 : (
  • 您的库中有哪些 JAR?
  • 我将编辑我的问题,您可以在那里看到我的 maven 依赖项。我基本上清除了所有其他东西,所以没有什么可以与任何东西冲突。 (就像 mp3 spi 所做的那样)
  • 您的类路径中似乎还有 vorbisspi1.0.2.jar。它包含一个 javax.sound.sampled.spi.FormatConversionProvider 而这个 FormatConversionProvider 不起作用。
  • 我终于通过我厚厚的头骨得到了它。我一起删除了原始依赖项。从那里开始,我得到了 classnotfoundexception 错误,直到我得到所有依赖项和 jar 引用正确为止。非常感谢您的帮助!
【解决方案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 的依赖项,现在 ogg 和 mp3 播放都可以通过 Java 声音 API 进行。

详情见我的博文: http://odoepner.wordpress.com/2013/07/19/play-mp3-or-ogg-using-javax-sound-sampled-mp3spi-vorbisspi/

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-07-06
      • 2017-02-22
      • 2018-11-28
      • 2012-12-14
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      相关资源
      最近更新 更多