Java中如何修改WAV音频采样率?设置参数后音频变慢如何解决
采样率转换失效问题根因与解决方案
问题根因
你当前的代码仅修改了音频的格式元数据,未对实际的PCM采样数据执行重采样运算。相当于强制播放器以20050Hz的速度播放原本适配24000Hz的采样点,直接表现就是播放速度变慢、音调降低、人声变粗。
正确实现方案
Java javax.sound.sampled 包已经内置了标准的采样率转换能力,你需要先按原始采样率完成音频拼接,再统一执行重采样,不要在拼接步骤修改采样率参数。
实现步骤
- 完成原始采样率下的音频拼接
保持原始24000Hz的格式不变,先把所有音频片段拼接成完整的音频流 - 定义目标采样率格式
注意目标格式的帧速率需要和目标采样率保持一致,不要复用原始流的帧速率参数 - 调用系统内置能力执行重采样转换
示例代码
// 步骤1:按原始24000Hz格式完成音频拼接 AudioInputStream rawAppendedStream = new AudioInputStream( new SequenceInputStream(appendedFiles, clip), appendedFiles.getFormat(), // 保留原始24000Hz格式,暂不修改 appendedFiles.getFrameLength() + clip.getFrameLength() ); // 步骤2:定义20050Hz的目标格式 AudioFormat targetFormat = new AudioFormat( rawAppendedStream.getFormat().getEncoding(), 20050, // 目标采样率 rawAppendedStream.getFormat().getSampleSizeInBits(), rawAppendedStream.getFormat().getChannels(), rawAppendedStream.getFormat().getFrameSize(), 20050, // 帧速率必须和目标采样率对应 rawAppendedStream.getFormat().isBigEndian() ); // 可选:提前检查当前环境是否支持该采样率转换 if (!AudioSystem.isConversionSupported(targetFormat, rawAppendedStream.getFormat())) { throw new UnsupportedOperationException("当前环境不支持24000Hz转20050Hz的采样率转换"); } // 步骤3:执行重采样,得到最终可用的音频流 AudioInputStream convertedStream = AudioSystem.getAudioInputStream(targetFormat, rawAppendedStream);
注意事项
- 20050Hz属于非通用标准采样率,如果内置转换不支持,可以引入第三方音频处理库完成重采样运算
- 重采样后的音频帧长度会发生变化,后续处理不要直接复用原始拼接流的帧长度参数
内容的提问来源于stack exchange,提问作者V. Pantis
相关产品推荐
相关产品推荐

