如何将cv2.VideoWriter帧流到RTSP服务器

6

环境: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服务器?任何想法都将不胜感激!谢谢。

使用gstreamer管道字符串而不是文件路径查看VideoWriter - Christoph Rackwitz
谢谢指引!我正在使用这个RTSP服务器 https://github.com/aler9/rtsp-simple-server,并且它提供了使用Gstreamer进行流媒体传输的示例。但是,它的文档以及我看到的每个示例都假设文件已经关闭。有没有任何链接可以指导如何在文件仍然打开并被写入的情况下使用Gstreamer? - chasez0r
使用多个VideoWriters或使用ffmpeg(ffmpeg具有API /库)。OpenCV是用于计算机视觉的库,而不是用于视频编码的。 - Christoph Rackwitz
谢谢!我在下面解决了。 - chasez0r
1个回答

8

经过大量搜索,我终于在子进程中使用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()

1
你如何启动接收者RTSP服务器并选择IP地址?谢谢。 - Lakshay Dulani
我遇到了这个错误: 连接到tcp://localhost:8554?timeout=0失败:连接被拒绝 无法为输出文件#0编写标头(不正确的编解码器参数?):连接被拒绝 初始化输出流0:0时出错-- - M.Hossein Rahimi

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