如何流式传输cv2.VideoWriter帧到RTSP服务器



环境:Docker, Ubuntu 20.04, OpenCV 3.5.4, FFmpeg 4.2.4

我目前正在使用CV_FFMPEG后端读取cv2.VideoCapture会话的输出,并使用cv2.VideoWriter成功地将其实时写回文件。我这样做的原因是在输入上绘制边界框并将其保存到新的输出。

问题是我在一个无头环境(Docker容器)中这样做。我想实时查看写入cv2.VideoWriter的内容。

我知道有很多方法可以通过使用XQuartz传递我的显示,例如,我可以使用cv2.imshow。但我真正想做的是将这些帧写入RTSP服务器。这样不仅我的主人可以"观看";但是其他主持人也可以观看。

视频发布后,我可以使用此命令轻松地将视频流式传输到我的RTSP服务器。

ffmpeg -re -stream_loop -1 -i output.mp4 -c copy -f rtsp rtsp://rtsp_server_host:8554/stream

是否有管道的框架,因为他们进入上面的命令?cv2.VideoWriter可以自己写帧到RTSP服务器吗?

任何想法将不胜感激!谢谢你。

经过多次搜索,我终于弄清楚了如何在子进程中使用FFmpeg来做到这一点。希望这能帮助到其他人!

def open_ffmpeg_stream_process(self):
args = (
"ffmpeg -re -stream_loop -1 -f rawvideo -pix_fmt "
"rgb24 -s 1920x1080 -i pipe:0 -pix_fmt yuv420p "
"-f rtsp rtsp://rtsp_server:8554/stream"
).split()
return subprocess.Popen(args, stdin=subprocess.PIPE)

def capture_loop():
ffmpeg_process = open_ffmpeg_stream_process()
capture = cv2.VideoCapture(<video/stream>)    
while True:
grabbed, frame = capture.read()
if not grabbed:
break
ffmpeg_process.stdin.write(frame.astype(np.uint8).tobytes())
capture.release()
ffmpeg_process.stdin.close()
ffmpeg_process.wait()

相关内容

  • 没有找到相关文章

最新更新