Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Video 具有多个实时流输入的ffmpeg在过滤后增加了异步延迟_Video_Ffmpeg_Udp_Video Streaming_Rtp - Fatal编程技术网

Video 具有多个实时流输入的ffmpeg在过滤后增加了异步延迟

Video 具有多个实时流输入的ffmpeg在过滤后增加了异步延迟,video,ffmpeg,udp,video-streaming,rtp,Video,Ffmpeg,Udp,Video Streaming,Rtp,我正在努力将ffmpeg应用于自动卡车的远程控制 在本地网络中有3个来自摄像机的视频流,用类似以下的.sdp文件描述(MJPEG over RTP,如果我错了请更正): m=视频50910 RTP/AVP 26 c=在IP4 192.168.1.91中 我想使用以下方法从三张图片合成一个视频流: ffmpeg -hide_banner -protocol_whitelist "rtp,file,udp" -i "cam1.sdp" \ -protocol_whitelist "rtp,file,

我正在努力将ffmpeg应用于自动卡车的远程控制

在本地网络中有3个来自摄像机的视频流,用类似以下的.sdp文件描述(MJPEG over RTP,如果我错了请更正):

m=视频50910 RTP/AVP 26
c=在IP4 192.168.1.91中

我想使用以下方法从三张图片合成一个视频流:

ffmpeg -hide_banner -protocol_whitelist "rtp,file,udp" -i "cam1.sdp" \
-protocol_whitelist "rtp,file,udp" -i "cam2.sdp" \
-protocol_whitelist "rtp,file,udp" -i "cam3.sdp" \
-filter_complex "\
nullsrc=size=1800x600 [back]; \
[back][b]overlay=1000[tmp1]; \
[tmp1][c]overlay=600[tmp2]; \
[tmp2][a]overlay" \
-vcodec libx264 \
-crf 25 -maxrate 4M -bufsize 8M -r 30 -preset ultrafast -tune zerolatency \
-f mpegts udp://localhost:1234
当我启动它时,ffmpeg开始发送关于RTP数据包丢失的错误。在输出中,每个摄像头的fps似乎都不稳定,因此这是不可接受的。 我能够同时在三个摄像头上启动ffplay或mplayer。我也可以使用预先录制的视频文件作为输入来制作这样的流。因此,ffmpeg似乎无法如此快速地读取三个UDP流。 摄像机以10 Mbit/s、800x600、30 fps MJPEG的速度传输,这些是我能负担得起的最低设置,但摄像机可以做得更多

所以我试着改变UDP缓冲区的大小。嗯,可以为UDP流设置缓冲区大小和fifo大小,但是对于使用.sdp文件描述的流,没有这样的选项。尽管我找到了一种使用类似于
rtp://
的URL运行流的方法,但它似乎没有将“?”之后的参数传递给UDP

我的下一个想法是启动多个ffmpeg实例,分别接收流,处理它们并重新流到另一个实例,该实例将使用任何类型的流,将它们缝合在一起并发送出去。这实际上是一个很好的设置,因为我需要单独过滤流,裁剪流,lenscorrect,rotate,也许单个ffmpeg实例上的大型过滤器组合无法处理所有流。我还要再吃三个

我尝试使用3 FIFOPPE或3
udp://localhost:124x
内部流。这些方法都没有解决我的问题,但是分离的ffmpeg实例似乎能够同时接收三个流。 我能够通过管道和通过mplayer或ffplay的UDP打开重复流。它们是完全同步和实时的 缝线仍然很糟糕。 管道让我的相机延迟了几秒钟,缝合后的水流波涛汹涌,不同步。 结果udp://给了我一个平滑的视频流,但是一个摄像头有5秒的延迟,其他的有15秒和25秒

这闻起来像缓冲液。更改fifo_大小和缓冲区_大小似乎影响不大。 我尝试在re-streamer实例中添加本地时间戳——这就是我发现5、15、25秒延迟的原因。 我尝试在stitcher实例中添加帧时间戳-它们完全同步。因此
setpts=PTS-STARTPTS
也不起作用


因此,缓冲区发生在udp://套接字和-filter_复杂输入之间。我怎样才能摆脱它?你觉得我的工作环境怎么样?我这样做完全错了吗?

可以通过在每次输入之前预加
-thread\u queue\u size 1024
来减轻数据包丢失(这是一个每输入命令)

你有没有找到一种改进相机间同步的方法?我没有,尽管我相信,在不打算从流中提取NTP数据的情况下,这种方法是将每个帧视为活动的,没有时间缓冲。不过,这种方法还不走运