如何同步不同fps的视频输入

如何同步不同fps的视频输入

我想做一些与此类似的事情指导但在这种情况下,两个输入具有相同的 fps,我想同步两个不同的帧速率输入,这里是一个示例:

ffmpeg \
  -f x11grab \
  -video_size 1920x1080 \
  -framerate 60 \
  -i :0.0 \
  -f v4l2 \
  -video_size 320x240 \
  -framerate 15 \
  -i /dev/video0 \
  -filter_complex '[0:v][1:v]overlay=10:(H-h)/2[o]' \
  -map '[o]' \
  -r 60 \
  -vcodec libx264 \
  -an \
  -f mpegts \
  udp://127.0.0.1:3333

然后观看:vlc udp://@127.0.0.1:3333

就我而言,它尴尬地给出了大约 10 fps 并且似乎很冻结,尽管我预计是 60 我相信它更有可能是 15,因为它是最低的,谁知道呢......

但是,如果我删除网络摄像头输入和过滤器,它会提供我想要的完整 60 fps,而当我仅流式传输网络摄像头时,它会提供 15 fps。

基于这另一本指南我也尝试过过滤器[1:v]fps=fps=60[wc];[0:v][wc]overlay=10:(H-h)/2[o],但没有成功。

我希望输出 fps 为 60,并且帧能够以某种方式很好地分布,从而避免冻结效果。如何使用 ffmpeg 同步两个不同 fps 的视频输入?

证据:

答案1

我仍然不知道到底为什么,但以下方法有效:

ffmpeg \
  -f x11grab \
  -video_size 1920x1080 \
  -framerate 60 \
  -i :0.0 \
  -f v4l2 \
  -video_size 320x240 \
  -framerate 15 \
  -i /dev/video0 \
  -filter_complex '[0:v]setpts=RTCTIME-RTCSTART[dt];[1:v]setpts=PTS-STARTPTS[wc];[dt][wc]overlay=10:(H-h)/2[o]' \
  -map '[o]' \
  -r 60 \
  -vcodec libx264 \
  -an \
  -f mpegts \
  udp://127.0.0.1:3333

尽管文档所说的RTCTIME已被弃用,并且大多数人都使用PTS-STARTPTS,但似乎我强制流基于时间而不是数字序列。

编辑:

使用以下过滤器也可以工作,我相信它更合适:

[0:v]setpts=N/FRAME_RATE/TB[dt];[1:v]setpts=N/FRAME_RATE/TB,fps=fps=60[wc];[dt][wc]overlay=10:(H-h)/2[o]

它确保固定的帧速率,并调整网络摄像头以使其输出与预期的帧速率相同。

相关内容