如何在FFmpeg的filter_complex表达式中让每个视频提前15秒开始?
如何在FFmpeg的filter_complex表达式中让每个视频提前15秒开始?
看起来你已经把多视频同步的核心逻辑摸透了,只是需要把每个视频的起始点往前挪15秒对吧?其实核心就是把你找到的同步点start_pts,减去15秒对应的pts数值,再用新数值作为trim的起始点就行。下面给你两种具体的实现方法,选哪种都可以:
方法一:直接计算pts差值(精准匹配流时间基)
FFmpeg的pts是基于视频流的时间基(time base)的,所以首先得确认每个视频流的时间基。你可以用ffprobe命令快速查看:
# 替换成你的目标视频文件名 ffprobe -v error -select_streams v:0 -show_entries stream=time_base -of default=noprint_wrappers=1:nokey=1 v_nimble_guardian.mkv
比如返回结果是1/1000,意思是1秒对应1000个pts单位,那15秒对应的pts就是15 * 1000 = 15000。
接下来把你原来的每个start_pts减去这个数值:
- 原
start_pts=59117→ 新start_pts=59117 - 15000 = 44117 - 原
start_pts=60483→ 新start_pts=60483 - 15000 = 45483 - 以此类推...
注意:如果计算后得到负数,说明这个视频的同步点本身就在开头15秒内,直接把start_pts设为0(从视频最开始截取)即可,不然FFmpeg会报错。
修改后的filter_complex片段示例:
-filter_complex " nullsrc=size=1920x1080 [base]; [0:v] trim=start_pts=44117,setpts=PTS-STARTPTS, scale=960x540 [upperleft]; [1:v] trim=start_pts=45483,setpts=PTS-STARTPTS, scale=960x540 [upperright]; [2:v] trim=start_pts=790117,setpts=PTS-STARTPTS, scale=960x540 [lowerleft]; [3:v] trim=start_pts=33100,setpts=PTS-STARTPTS, scale=960x540 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=960 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=540 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=960:y=540[v] "
方法二:用秒数代替pts(更直观)
如果你觉得计算pts太麻烦,可以直接用trim=start参数,它接受秒数作为输入,不用纠结时间基:
- 先把同步点的
start_pts转换成秒数:同步点秒数 = start_pts × 时间基(比如start_pts=59117,时间基1/1000,就是59117 × 0.001 = 59.117秒) - 减去15秒,得到新的起始秒数:
59.117 - 15 = 44.117秒 - 把
trim=start_pts=xxx改成trim=start=44.117
这种写法更易懂,不容易出错,修改后的片段示例:
[0:v] trim=start=44.117,setpts=PTS-STARTPTS, scale=960x540 [upperleft];
最后提醒一下:不管用哪种方法,setpts=PTS-STARTPTS一定要保留,它会把你新截取的视频起始点重置为0,这样四个视频的同步点都会在输出的第15秒位置,保证完全对齐。
备注:内容来源于stack exchange,提问作者PirateApp
相关产品推荐
相关产品推荐

