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

Posted

技术标签:

【中文标题】如何在ffmpeg中同步多个rtsp输入?【英文标题】:How to sync multiple rtsp inputs in ffmpeg? 【发布时间】:2019-07-30 18:58:16 【问题描述】:

我正在使用 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 以及它如何处理输入的问题。

如何同步输出中的不同来源?

【问题讨论】:

【参考方案1】:

尝试在-i 之前添加-fflags nobuffer -flags low_delay -strict experimental。 由于没有参考帧,您可能会在开始时看到一些弯曲的帧。

【讨论】:

这帮助我将多个 rtmp 输入流同步到一个破折号输出。谢谢!【参考方案2】:

尝试删除:

-rtsp_transport tcp

设置视频点

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 日的版本,它可以工作。)

【讨论】:

以上是关于如何在ffmpeg中同步多个rtsp输入?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ffmpeg 从 C++ 内存中的多个图像流式传输 RTSP

rtsp实时流通过rtmp推送到服务端

如何使用 FFMPEG 保存 rtsp 流而不丢包

如何配置ffmpeg只是为了播放RTSP视频

android 如何播放rtsp://110.80.31.70:6000/channe1

如何在 wowza 上使用 rtsp 播放流?