AudioSystem.getAudioInputStream() 读取 WAV 失败主因是格式不兼容或路径错误;需确认为 PCM_SIGNED/UNSIGNED 格式、用绝对路径、采样率≤48000Hz,手机或 Audacity 录音应选“WAV (Microsoft) signed 16-bit PCM”。

AudioSystem.getAudioInputStream() 读取 WAV 文件失败?检查路径和格式
Java Sound API 能直接播放标准 PCM 编码的 WAV 文件,但对压缩格式(如 ADPCM、IMA ADPCM)或带元数据的 WAV(比如某些录音软件导出的“WAV (RF64)”)会抛 UnsupportedAudioFileException。不是所有后缀是 .wav 的文件都真正兼容。
- 优先用绝对路径测试,避免因工作目录不明确导致
FileNotFoundException - 用
ffprobe your.wav或在线工具确认编码:必须是PCM_SIGNED或PCM_UNSIGNED,采样率建议 ≤ 48000 Hz - 如果文件来自手机录音或 Audacity 导出,选 “WAV (Microsoft) signed 16-bit PCM” 格式再试
Clip.open() 后调用 start() 没声音?线程生命周期和资源释放要手动管
Clip 是短音频(通常 start()。
AudioInputStream ais = AudioSystem.getAudioInputStream(new File("sound.wav"));
Clip clip = AudioSystem.getClip();
clip.open(ais);
clip.start(); // 必须显式调用
// ⚠️ 这里如果不等待,JVM 可能立刻退出,声音被中断
Thread.sleep(clip.getMicrosecondLength() / 1000 + 100); // 粗略等待播放完成
clip.close();
ais.close();
-
clip.start()是异步的,不阻塞当前线程 - 必须手动
close()Clip和AudioInputStream,否则可能泄漏音频资源(尤其反复播放时) - 若需播放完回调,监听
LineEvent.Type.STOP,而不是依赖sleep
播放时出现 “No line matches” 或 “Mixer not available” 错误?检查系统音频设备状态
这类错误往往不是代码问题,而是运行环境缺失音频输出能力。Linux 服务器、Docker 容器、无桌面 macOS 终端默认没有可用 Mixer。
- Windows / macOS 桌面环境一般正常;Linux 需确保已安装 PulseAudio 或 ALSA,并有用户权限访问
/dev/snd/ - Docker 中加
--device /dev/snd --group-add audio并安装alsa-utils测试aplay -l - 开发调试时,可在打开前打印可用混音器:
Arrays.stream(AudioSystem.getMixerInfo()).forEach(System.out::println)
想循环播放或控制音量?Clip 提供基础控制,但别用 setMicrosecondPosition() 做暂停
Clip 支持循环(loop(Clip.LOOP_CONTINUOUSLY))和音量调节(通过 FloatControl.Type.MASTER_GAIN),但它的 stop() 会重置位置,不能用于“暂停/继续”逻辑。
立即学习“Java免费学习笔记(深入)”;
Clip clip = AudioSystem.getClip(); clip.open(ais); FloatControl volume = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); volume.setValue(-10.0f); // 降低约 10dB clip.loop(Clip.LOOP_CONTINUOUSLY);
- 音量范围通常是
-80.0f(静音)到6.0206f(+6dB),超出会静音或报异常 - 真正的暂停需自己记录位置,用
stop()+setMicrosecondPosition()+start(),但注意精度误差 - 长音频、流式播放、精确同步场景,应改用
SourceDataLine,而非Clip










