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

如何通过FFmpegKit调整音频音高并保持原音频时长?

Flutter FFmpegKit 音频变调(保持原时长)问题解决

问题分析

你尝试的两种方案存在以下问题:

  • 尝试1:硬编码将采样率强制设置为8000Hz,远低于多数音频的原生采样率(如44100Hz/48000Hz),强制降采样直接导致高频音质丢失。
  • 尝试2:硬编码使用44100Hz采样率,若原音频采样率并非44100Hz,会导致采样率转换逻辑错误,最终引发时长异常缩短。

正确解决方案

方案1:使用rubberband滤镜(推荐,音质最优)

rubberband是FFmpeg专门用于变调不变速的滤镜,能在保持原音频时长的同时精准调整音高,且音质损失极小。FFmpegKit的full版本已包含该滤镜支持。

await FFmpegKit.executeAsync(
  '-i input.mp3 -af rubberband=pitch=1.5 output.mp3', 
  ffmpegCallbackHigh
);
  • pitch=1.5:将音高提升1.5倍;若需降低音高,设置为小于1的数值(如pitch=0.8)。

方案2:修复asetrate+aresample+atempo组合逻辑

避免硬编码采样率,使用FFmpeg内置变量%{sample_rate}获取原音频的采样率,确保处理逻辑适配所有音频:

await FFmpegKit.executeAsync(
  '-i input.mp3 -af asetrate=%{sample_rate}*1.5,aresample=%{sample_rate},atempo=1/1.5 output.mp3', 
  ffmpegCallbackHigh
);
  • asetrate=%{sample_rate}*1.5:基于原采样率提升音频速率(实现变调)
  • aresample=%{sample_rate}:将采样率还原为原数值
  • atempo=1/1.5:将播放速度降低至原速的1/1.5,抵消速率变化带来的时长改变,最终保持原时长不变

内容的提问来源于stack exchange,提问作者whatwhatwhat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:15:40