You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:55:37