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 秒的时候才开始叠加视频的,如下:

不过前面说过,帧同步算法实现的是 紧挨着 的逻辑,看着跟 pts 偏移好像没什么关系。
但 紧挨着 的算法,恰恰就能满足这种 pts 时间轴偏移的需求的。
首先 紧挨着 的算法是 从 同步流 里面选出一个 同步帧,这个同步帧在时间轴上的位置是 P,其他的流就从时间位置 P 往前面找,找出紧挨着 P 位置的帧去做滤波。
由于我们用 setpts 把第二个流的时间偏移了 5 秒,所以第二个流在前5秒是没有帧的。所以 从 P 位置往前找,是找不到 第二个流的帧。如下:

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

由于拿不到 second 帧,所以他会直接传递 mainpic 给 下一个滤镜,所以 overlay 叠加操作是在第 5 秒的时候才开始执行的。
这就是帧同步里面实现 时间偏移 滤波的逻辑。
