FrameSync帧同步—pts偏移

作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音

熟悉 ffmpeg 命令行的朋友都知道,在使用 overlay 滤镜的时候,我们可以加上 setpts 来进行时间偏移,控制什么时候才进行 叠加操作,如下:

ffmpeg -an -i juren-30s.mp4 -an -i juren-30s-small.mp4  -filter_complex "[1:v]setpts=5/TB+PTS[second];[0:v][second]overlay=18:20" out.mp4

上面我把第二个流偏移了 5 秒,TB 是 time_base 的意思。

可以发现,输出的 out.mp4 是在第 5 秒的时候才开始叠加视频的,如下:

1-1

不过前面说过,帧同步算法实现的是 紧挨着 的逻辑,看着跟 pts 偏移好像没什么关系。

但 紧挨着 的算法,恰恰就能满足这种 pts 时间轴偏移的需求的。

首先 紧挨着 的算法是 从 同步流 里面选出一个 同步帧,这个同步帧在时间轴上的位置是 P,其他的流就从时间位置 P 往前面找,找出紧挨着 P 位置的帧去做滤波。

由于我们用 setpts 把第二个流的时间偏移了 5 秒,所以第二个流在前5秒是没有帧的。所以 从 P 位置往前找,是找不到 第二个流的帧。如下:

1-2

我们可以断点调试一下 do_blend() 函数,会发现,在第5秒之前,是一直拿不到 second 帧的。

1-3

由于拿不到 second 帧,所以他会直接传递 mainpic 给 下一个滤镜,所以 overlay 叠加操作是在第 5 秒的时候才开始执行的。

这就是帧同步里面实现 时间偏移 滤波的逻辑。


FFmpeg书籍版权所属@罗上文 2025 all right reserved,powered by Gitbook该文件修订时间: 2026-08-14 15:25:19

results matching ""

    No results matching ""