【问题标题】:Java SPI using multiple providers fails (Java Sound)使用多个提供程序的 Java SPI 失败 (Java Sound)
【发布时间】:2023-03-23 21:05:02
【问题描述】:

我有一个需要播放 mp3 和 aac 文件的 java 项目。我创建了一个 MediaPlayer 类,它使用通用代码通过 Java Sound API 播放声音文件。我的 CLASSPATH 中有两个注册为 Java Sound SPI 的 audo 解码库。 (MP3SPI 和 JAAD)。

问题是 MP3SPI 似乎优先于 JAAD。这意味着当我播放 AAC 文件时,MP3SPI 会引发异常并且(显然)不会播放我的歌曲。当我从 CLASSPATH 中删除 MP3SPI 时,会调用正确的 SPI (JAAD),并且我的 AAC 文件可以正常播放。

由于这个问题可能更通用,我希望有人有解决这个问题的经验。

如何同时支持 MP3 和 AAC 解码/播放?

【问题讨论】:

  • AAC 文件的文件扩展名是什么?问题是否可以表述为“如何同时支持 MP3 和 AAC 编码?”?如果没有,请edit(我的编辑)回答您的问题。
  • 我认为 JDK 7 中提供了一个修复程序,可以在运行时选择/取消选择提供程序。 bugs.sun.com/bugdatabase/view_bug.do?bug_id=4666881
  • Usman,此修复尚未实现(计划用于 Java 8)。还有其他想法吗?编辑:在我的 Linux 机器上,冲突似乎不存在,这意味着 jaad 和 mp3spi 很好地共存......我会继续调查。谢谢。
  • 正确播放的文件类型取决于 jar 文件在 CLASSPATH 中的位置。 Windows:仅当 JAAD 位于类路径的首位时才播放 AAC,仅当 mp3spi 位于类路径的首位时才播放 mp3。这是有道理的。 Linux:无论顺序如何都可以工作。 Linux JVM > Windows JVM?

标签: java javasound


【解决方案1】:

听起来 MP3SPI 行为不端,没有按照规范播放,即抛出错误的异常或在应该抛出异常时不抛出。

你基本上只有两个选择:

  1. 破解 MP3SPI 并修复它(查看它的 AudioFileReader 实现并验证它们的行为方式是否符合 javadocs 中指定的方式)。
  2. 使用不同的 mp3 服务提供商(例如 this oneone of these)。

祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    相关资源
    最近更新 更多