如何通过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
相关产品推荐
相关产品推荐

