You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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参数,它接受秒数作为输入,不用纠结时间基:

  1. 先把同步点的start_pts转换成秒数:同步点秒数 = start_pts × 时间基(比如start_pts=59117,时间基1/1000,就是59117 × 0.001 = 59.117秒)
  2. 减去15秒,得到新的起始秒数:59.117 - 15 = 44.117秒
  3. 把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 08:52:46