ffmpeg 的“setpts”过滤器究竟做了什么?

ed2*_*d22 7 ffmpeg

我找了很长时间,无论我看到哪里,它都像是显而易见的东西,是常识。ffmpeg 的“setpts”过滤器究竟做了什么?为什么要使用 将其重置为零setpts=PTS-STARTPTS?谢谢。

Gya*_*yan 10

PTS 代表演示时间戳。请参阅ffmpeg 中的视频时标、时基或时间戳是什么?

setpts 过滤器评估表达式并将值分配为它正在处理的当前帧的时间戳

例如setpts=2*N+5/TB,其中 N 是从 0 开始的帧索引,TB 是流的时基。假设它是 1/1000,所以每个 PTS 单位是 1 毫秒。

所以,对于每一帧,它会如下,

N       expression        New PTS    New PTS time
0     2*0+5/(1/1000)       5000        5.000 sec
1     2*1+5/(1/1000)       5002        5.002 sec
2     2*2+5/(1/1000)       5004        5.004 sec
...
Run Code Online (Sandbox Code Playgroud)

通过时间戳同步多个输入的过滤器,即在覆盖过滤器中,过滤器会将时间戳为 5.0 的覆盖输入覆盖在 PTS 时间为 5.0 的主输入上。如果流具有不同的起始 PTS,这可能会导致意外输出,因此将重置时间戳,以便每个流从 0 开始。当然,如果您有自定义同步,那么您将相应地修改 setpts expr。

另一个原因是,当流具有非零的起始时间戳时,ffmpeg 可能会在-vsync cfr模式中复制帧以插入从时间戳 0 到该初始时间戳的间隙。这仅在少数情况下相关。

  • 作为 MPEG 传输流发送的广播源具有非零起始 PTS。使用修剪过滤器的流剪切可以具有非零起始 PTS。还有很多其他方法。 (4认同)
  • setpts 最终会影响数据包时间戳,因此 container.setpts 会影响数据包时间戳。 (3认同)