FFMPEG使用filter_complex_script剪辑多段区间出现流重复问题
FFMPEG多段时间区间剪辑多流问题解决方案
问题根源
你当前的filter_complex脚本写法错误,所有滤镜都是独立读取原始输入流,没有串联成连续的处理链路,导致每个滤镜单独生成一路输出流,最终出现2条视频流+2条音频流的异常输出。
setpts参数说明
setpts的作用是重新计算视频帧的时间戳:select/aselect过滤掉不符合条件的帧后,剩余帧的时间戳会出现断层,setpts=N/FRAME_RATE/TB就是把保留的帧按顺序重新分配连续的时间戳,避免输出时长异常、音画不同步,asetpts是音频维度对应的同类参数。你遇到的逗号语法警告是FFMPEG对嵌套引号、表达式特殊符号的校验提示,只要表达式逻辑正确,不影响实际运行。
修复方案
第一步:修改mysavedscript.txt内容
将滤镜按处理顺序串联,给中间输出的流做标识命名:
# 视频处理链路:先筛选帧,再重写时间戳,最终输出命名为out_v [0:v:0]select='between(t,10.5,12.0)+between(t,12.5,15.0)+between(t,17.5,20.5)+between(t,23.0,25.0)'[v_selected]; [v_selected]setpts=N/FRAME_RATE/TB[out_v]; # 音频处理链路:同理,最终输出命名为out_a [0:a:0]aselect='between(t,10.5,12.0)+between(t,12.5,15.0)+between(t,17.5,20.5)+between(t,23.0,25.0)'[a_selected]; [a_selected]asetpts=N/SR/TB[out_a]
第二步:修改执行命令,指定流映射
手动指定只输出我们处理好的out_v和out_a流,避免FFMPEG把所有生成的中间流都塞进输出文件:
ffmpeg -y -i 0310.mp4 -filter_complex_script mysavedscript.txt -map "[out_v]" -map "[out_a]" -vcodec libx264 -b:v 978k -acodec aac -b:a 242k 0310_TT.mp4
更优批量剪辑方案
如果不需要调整码率、分辨率等参数,想要实现你提到的无需转码的剪辑效果,可以用concat demuxer方案,速度远快于转码方案:
- 准备片段配置文件
segments.txt,格式如下:
file '0310.mp4' inpoint 10.5 outpoint 12.0 file '0310.mp4' inpoint 12.5 outpoint 15.0 file '0310.mp4' inpoint 17.5 outpoint 20.5 file '0310.mp4' inpoint 23.0 outpoint 25.0
- 执行快速剪辑命令:
ffmpeg -y -f concat -safe 0 -i segments.txt -c copy -avoid_negative_ts make_zero output.mp4
该方案直接复制原始音视频流,无需重新编码,仅需几秒即可完成剪辑;如果对剪切点精度要求极高,不能接受非关键帧剪切的开头少量花屏问题,再使用前面的转码方案即可。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

