问题描述
说明:
我有一个要求,我必须对来自DeckLink设备的单个摄像机流做两件事-OpenCV处理和RTMP实时流。如果相关,则设备为DeckLink 8K Pro。
DeckLink设备(一个特定端口)不允许一个以上的应用程序访问视频流。我的两个应用程序是:
- 必须在视频流上运行图像处理算法的C ++ OpenCV应用程序。
- 必须通过RTMP将流推送到远程端点的Unreal Media Server,后者应将流重新分发给客户端。
两个应用程序必须在同一Windows工作站上运行。
问题:
如果其中一个应用程序正在运行,则它具有视频流的独占访问权,而另一个应用程序无法读取该流,并且似乎没有解决此问题的方法。
所以,我真的在寻找一种智能解决方案,其中一些人可能以前已经实施过,或者有一个想法可能对我有用。
到目前为止我的解决方案:
在此解决方案中,虚幻媒体服务器被FFMPEG取代。
由于OP必须在解决方案中投入才能在此处发布,所以过去一周我一直在浏览可能的解决方案。我想出了一个基于FFMPEG的解决方案,该解决方案是唯一读取DeckLink视频流并在单个命令中完成两项功能的应用程序-通过RTMP推送视频数据包并创建本地UDP流。而且,OpenCV的VideoCapture类能够拾取UDP流。为了进行测试,我将Twitch用作RTMP服务器,将VLC用作UDP测试器。它可以工作,并且似乎是一个不错的解决方案,除了UDP流中引入的延迟约为0.4秒。不幸的是,我无法评估RTMP延迟,因为Twitch自行引入了自己的> 5s延迟。但这现在不是问题。
这是FFMPEG解决方案(请注意,我在这里使用计算机网络摄像头,但DeckLink也是如此)。
通过:
ffmpeg -threads:v 2 -threads:a 8 -filter_threads 2 -thread_queue_size 512 -y -f dshow -video_size 640x480 -pixel_format yuyv422 -framerate 30 -rtbufsize 100M -i video="HD WebCam" -f dshow -rtbufsize 100M -i audio="Microphone Array (Realtek High DeFinition Audio(sst))" -preset ultrafast -vcodec libx264 -tune zerolatency -b 900k -map 0:v:0 -f mpegts udp://127.0.0.1:5555 -pix_fmt yuv420p -c:v libx264 -qp:v 19 -profile:v high -rc:v cbr_ld_hq -level:v 4.2 -r:v 60 -g:v 120 -bf:v 3 -refs:v 16 -f flv rtmp://live-fra05.twitch.tv/app/stream_key
播放方式:
ffplay -probesize 32 -sync ext udp://127.0.0.1:5555
我想听听您将如何改进自己的解决方案以更好地解决问题(例如,减少延迟),或者是否有比我更好的解决方案。
谢谢。
解决方法
一旦流到达Unreal Media Server,您就可以使用Unreal Media Server Configurator启动MPEG2-TS广播该流。然后,您的OpenCV的VideoCapture类也将能够提取该MPEG2-TS UDP流。