使用多个提供程序的Java SPI失败(Java声音)

使用多个提供程序的Java SPI失败(Java声音),java,javasound,Java,Javasound,我有一个java项目,需要播放mp3和aac文件。我创建了一个MediaPlayer类,它使用通用代码通过Java声音API播放声音文件。我的类路径中有两个audo解码库,它们注册为Java声音SPI。(MP3SPI和JAAD) 问题是MP3SPI似乎优先于JAAD。这意味着当我播放AAC文件时,MP3SPI会抛出一个异常,并且(显然)不会播放我的歌曲。当我从类路径中删除MP3SPI时,将调用正确的SPI(JAAD),并且我的AAC文件可以正常运行 由于这个问题可能更一般地表现出来,我希望有人有

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

问题是MP3SPI似乎优先于JAAD。这意味着当我播放AAC文件时,MP3SPI会抛出一个异常,并且(显然)不会播放我的歌曲。当我从类路径中删除MP3SPI时,将调用正确的SPI(JAAD),并且我的AAC文件可以正常运行

由于这个问题可能更一般地表现出来,我希望有人有解决这个问题的经验


如何为MP3和AAC解码/播放提供支持?

听起来MP3SPI行为不正常,不按规范播放,即在应该的时候抛出错误的异常或无异常

您基本上只有两种选择:

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

  • 祝你好运。

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