PAYATHON 2026

Java 如何播放 8 kHz 的 ULAW AU 音频?

数据阿明

结论

这段输出不能证明声音硬件完全无法播放 8 kHz 音频。它显示,当前 Java Sound 环境没有找到代码检查的可用 SourceDataLine 格式:原始 ULAW 8000 Hz 格式不受支持,列出的两种 PCM_SIGNED 8000 Hz 格式也没有可用线路。

日志中 AudioSystem.getTargetFormats(...) 列出的目标格式只有 8 kHz PCM。这些格式是可用的转换候选项,并不表示音频已经重采样到 16 kHz。解码 μ-law 可以把数据转成 PCM;要改变采样率,还需要对音频数据进行重采样。

先确认当前线路支持哪些格式

AudioSystem.isLineSupported(...) 用于检查当前 Java Sound 环境能否提供符合给定 DataLine.Info 的线路。可以先列出可用的混音器和线路信息,再选择实际支持的格式。支持情况会因操作系统、音频设备和已安装的 Java Sound provider 而异。

转换或重采样

可以先试用 Java Sound 的格式转换 API。能否转换到指定采样率,取决于已安装的转换 provider。转换前应检查目标格式是否可用;如果 provider 不支持从 8 kHz 重采样到目标采样率,调用转换 API 也无法完成重采样。

如果当前环境没有合适的重采样 provider,可以用 FFmpeg 将 AU 文件解码并重采样为 PCM WAV:

ffmpeg -i input.au -ar 16000 -ac 1 -c:a pcm_s16le output.wav

然后让 Java 播放生成的 WAV 文件,并确认 SourceDataLine 支持该文件的格式。这里的 16 kHz 只是示例。如果线路不支持,可以改用设备支持的采样率,例如 44.1 kHz 或 48 kHz,并按对应采样率转换文件。也可以使用带有重采样功能的 Java 音频库,在程序内完成转换。

注意事项

不要只修改 AudioFormat 中的采样率数值。这样不会重采样音频,只会让程序以错误的速率解释原始数据,可能造成播放速度、时长或音调异常。应转换实际音频数据,并使用线路支持的完整格式。

备注:内容仅供参考。