X11

如何同步不同的fps影片輸入

  • September 6, 2020

我想做與本指南中的類似的事情,但在這種情況下,兩個輸入具有相同的 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。

基於this other guide我也嘗試了過濾器[1:v]fps=fps=60[wc];[0:v][wc]overlay=10:(H-h)/2[o],但沒有成功。

我希望輸出 fps 為 60,並且幀以某種方式很好地分佈以避免凍結效果。如何使用 ffmpeg 同步兩個不同的 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]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]

它確保了固定的幀速率,並調整網路攝像頭以在輸出上具有與預期相同的幀速率。

引用自:https://unix.stackexchange.com/questions/607767