Jaad与Javax Sound依赖冲突导致WAV采样率读取异常求助
问题分析与解决方案
问题根源
Jaad的AACAudioFileReader作为Java Sound SPI扩展,未正确限制仅处理AAC格式文件。调用AudioSystem.getAudioFileFormat()时,Java Sound会遍历所有注册的AudioFileReader,Jaad的实现错误地尝试解析WAV文件,导致内部解码器配置为空,触发空指针异常。
是否为已知Bug?
这属于Jaad SPI实现的缺陷,大概率是已知问题(可查看项目Issue跟踪)。核心问题是它没有在getAudioFileFormat()中先验证文件是否为AAC格式,就直接进入解码流程。
解决方法
方法1:显式指定原生WAV阅读器
绕过AudioSystem的自动发现逻辑,直接使用Java原生的WavAudioFileReader处理WAV文件,彻底避免Jaad的SPI干扰:
import javax.sound.sampled.spi.WavAudioFileReader; // ... public static int getSampleRate(String audioFilePath) throws FileNotFoundException { File audioFile = new File(audioFilePath); try { WavAudioFileReader wavReader = new WavAudioFileReader(); AudioFileFormat audioFileFormat = wavReader.getAudioFileFormat(audioFile); int sampleRate = (int) audioFileFormat.getFormat().getSampleRate(); return sampleRate; } catch (UnsupportedAudioFileException|IOException e) { throw new RuntimeException(e); } }
方法2:排除Jaad的SPI类
在Maven依赖中排除Jaad的SPI模块,阻止它注册到Java Sound服务中,仅保留AAC解析的核心功能(处理AAC时需手动调用Jaad核心API,如你项目中AacSampleRateExtractorTest的实现方式):
<dependency> <groupId>com.tianscar.javasound</groupId> <artifactId>jaad</artifactId> <version>0.9.4</version> <exclusions> <exclusion> <groupId>com.tianscar.javasound</groupId> <artifactId>jaad-spi</artifactId> </exclusion> </exclusions> </dependency>
方法3:过滤SPI加载
在项目的src/main/resources/META-INF/services/javax.sound.sampled.spi.AudioFileReader文件中,仅保留原生阅读器的类名,移除Jaad的net.sourceforge.jaad.spi.javasound.AACAudioFileReader:
com.sun.media.sound.WavAudioFileReader com.sun.media.sound.AuAudioFileReader com.sun.media.sound.AiffAudioFileReader
这样Java Sound就不会加载Jaad的阅读器,从根源上避免干扰。
内容的提问来源于stack exchange,提问作者Jacobs2000
相关产品推荐
相关产品推荐

