如何在ffmpeg中同步多个RTSP输入?

6
我正在使用ffmpeg将本地网络摄像机的多个rtsp流合并为单个输出。在生成的视频中,这些视频不同步。
ffmpeg -loglevel warning \
        -f image2 -loop 1 \
        -i logo.png \
        -rtsp_transport tcp -thread_queue_size 1024 \
        -i "rtsp://10.0.0.1" \
        -rtsp_transport tcp -thread_queue_size 1024 \
        -i "rtsp://10.0.0.2" \
        -rtsp_transport tcp -thread_queue_size 1024 \
        -i "rtsp://10.0.0.3" \
        -filter_complex "[3:v][2:v][0:v][1:v]xstack=inputs=4:layout=0_0|w0_0|0_h0|w0_h0[v]" \
        -map "[v]" \
        -filter_complex "[1:a][1:a]amerge=inputs=2[aout]" -map "[aout]" \
        -vcodec libx264 -pix_fmt yuv420p -r 30 -g 60 \
        -preset fast -b:v 2400k -maxrate 4600k -bufsize 6000k \
        -acodec aac -ar 44100 -b:a 128k \
        -f flv "rtmp://live-api-s.facebook.com:80/rtmp/$STREAMKEY"


如果我们以第一个输入(0)(10.0.0.1)作为参考,第二个输入(1)最初比参考时间提前约1000毫秒,而第三个输入(2)则提前约2000毫秒。看起来偏移量甚至会随时间略微增加。
我尝试交换不同的输入(例如将10.0.0.3更改为输入0,将10.0.0.1更改为输入2),然后10.0.0.1领先于10.0.0.3。因此,我认为这是ffmpeg的问题,以及它如何处理输入。
如何在输出中同步不同的来源?
2个回答

7

尝试在-i之前添加-fflags nobuffer -flags low_delay -strict experimental。可能会在开头看到一些损坏的帧,因为没有参考帧。


这帮助我将多个RTMP输入流同步到一个DASH输出中。谢谢! - cub33

1
尝试移除以下内容:
-rtsp_transport tcp

设置视频的PTS。
SETPTS="setpts='(RTCTIME - RTCSTART) / (TB * 1000000)'"

...
 -filter_complex \
 " [1:v]${SETPTS}[1v]; \
   [2:v]${SETPTS}[2v]; \
   [3:v]${SETPTS}[3v]; \
   [3v][2v][0:v][1v]xstack...

来自ffmpeg文档https://ffmpeg.org/ffmpeg-filters.html#Examples-139(一些文档称其已弃用,但我正在使用11月27日版本并且它可以工作。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接