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

Java中如何修改WAV音频采样率?设置参数后音频变慢如何解决

采样率转换失效问题根因与解决方案

问题根因

你当前的代码仅修改了音频的格式元数据,未对实际的PCM采样数据执行重采样运算。相当于强制播放器以20050Hz的速度播放原本适配24000Hz的采样点,直接表现就是播放速度变慢、音调降低、人声变粗。

正确实现方案

Java javax.sound.sampled 包已经内置了标准的采样率转换能力,你需要先按原始采样率完成音频拼接,再统一执行重采样,不要在拼接步骤修改采样率参数。

实现步骤

  1. 完成原始采样率下的音频拼接
    保持原始24000Hz的格式不变,先把所有音频片段拼接成完整的音频流
  2. 定义目标采样率格式
    注意目标格式的帧速率需要和目标采样率保持一致,不要复用原始流的帧速率参数
  3. 调用系统内置能力执行重采样转换

示例代码

// 步骤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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:06:03