我想做一些与此类似的事情指导但在这种情况下,两个输入具有相同的 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]
它确保固定的帧速率,并调整网络摄像头以使其输出与预期的帧速率相同。