能否用FFmpeg一次性完成SRT字幕硬嵌与音视频变速且不调音调?
单次编码实现视频变速+硬嵌字幕的解决方案
完全可以在单次编码中同时完成视频变速(保持音频音调)和硬嵌SRT字幕这两个操作,不需要分两次编码。核心思路是把原本分开的视频滤镜逻辑整合到同一个filter_complex复杂滤镜链里,具体实现如下:
合并后的fish shell函数
function ffmpeg-speedup-burnin # 参数说明:$argv[1] = 输入视频文件,$argv[2] = 变速倍率,$argv[3] = SRT字幕文件路径 ffmpeg -i $argv[1] -filter_complex "[0:v]setpts=1/$argv[2]*PTS,subtitles=$argv[3][v];[0:a]rubberband=tempo=$argv[2][a]" -map "[v]" -map "[a]" -preset ultrafast "$(date +%Y%m%d%H%M%S)-output.mkv" end
代码说明
- 视频处理链:先通过
setpts=1/$argv[2]*PTS实现视频变速,紧接着用subtitles=$argv[3]把字幕硬嵌到变速后的视频上,两者用逗号分隔形成连续的滤镜链 - 音频处理:用
rubberband=tempo=$argv[2]实现音频变速且保持原始音调,参数和视频变速倍率一致 - 输出文件名用
date命令生成时间戳,避免重复覆盖 -preset ultrafast用于快速编码,若追求画质可换成medium或slow这类预设
极端情况的替代方案
如果因为滤镜兼容性问题(比如某些旧版ffmpeg不支持滤镜链嵌套)无法使用上述方法,最优替代方案是用管道传递原始流,避免写入中间文件,速度几乎和单次编码一致,且画质无损失:
# 示例:2倍速+嵌入sub.srt ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=1/2*PTS[v];[0:a]rubberband=tempo=2[a]" -map "[v]" -map "[a]" -c:v rawvideo -c:a pcm_s16le -f matroska - | ffmpeg -i - -vf subtitles=sub.srt -preset ultrafast output.mkv
这里第一个ffmpeg输出未编码的原始视频和音频流,直接通过管道传给第二个ffmpeg处理字幕,全程没有中间文件的写入和读取开销。
内容的提问来源于stack exchange,提问作者MANICX100
相关产品推荐
相关产品推荐

