如何使用FFmpeg调整视频音高,无需提取合并音轨?
FFmpeg调整视频内置音频音高操作方案
完全可以实现该需求,无需单独提取、合并音轨,直接通过FFmpeg的音频滤镜处理内置音轨即可,原视频流可直接拷贝不重新编码,操作效率极高。
方案1:不改变音频时长调整音高(推荐)
使用rubberband滤镜,支持无时长变化的音高调整,对音频音质损伤较小:
ffmpeg -i 输入视频路径 -filter_complex "[0:a]rubberband=pitch=半音偏移值[a]" -map 0:v -map "[a]" -c:v copy 输出视频路径
参数说明:
pitch值为半音偏移量,正数代表升调,负数代表降调,比如pitch=2就是升2个半音,pitch=-3就是降3个半音-c:v copy表示直接拷贝原视频流,不重新编码,速度快且无画质损失- 如果你需要按倍率调整音高,可以把
pitch=半音偏移值替换为pitch_scale=倍率,比如pitch_scale=1.2就是将音高调整为原来的1.2倍
方案2:无依赖轻量调音高方案
如果你的FFmpeg没有rubberband编译支持,可以使用asetrate滤镜实现调整:
- 可接受音频时长同步变化(升调语速变快、降调语速变慢)的场景可以直接用以下命令:
ffmpeg -i 输入视频路径 -filter:a "asetrate=原采样率*音高倍率" -c:v copy 输出视频路径 - 需要保持时长不变的话,可以在滤镜后追加atempo参数修正时长,以升调2个半音(音高倍率为2^(2/12)≈1.122)为例:
ffmpeg -i 输入视频路径 -filter:a "asetrate=44100*1.122,atempo=1/1.122" -c:v copy 输出视频路径
注意事项
- 如果调整指定音轨,将滤镜中
[0:a]修改为对应音轨序号即可,比如调整第2个音轨改为[0:a:1](序号从0开始计数) - Windows用户如果提示找不到rubberband滤镜,可以下载FFmpeg完整编译版本使用
- Linux用户可以先安装
librubberband-dev依赖后重新编译FFmpeg,即可使用rubberband滤镜
内容的提问来源于stack exchange,提问作者Syed Hussain Bukhari
相关产品推荐
相关产品推荐

