如何通过 OpenCV 处理 VLC UDP 流

J. *_* S. 0 python opencv udp vlc h.264

我能够通过 VLC 命令行接收/查看 UDP h264 数据包(即 VLC --network-caching 0 --demux h264 udp://...)

我计划通过 OpenCV 算法处理这些帧。但是,我似乎找不到将 VLC 帧发送到我的 Python OpenCV 脚本的方法。

是否可以通过管道在单独的脚本中通过 Numpy 处理 VLC 流输出?

我之前曾尝试使用其 VideoCapture 功能直接流式传输到 OpenCV,但由于某种原因,视频停顿并停止在扭曲的黑色图像处。目前,似乎合并 VLC 是唯一的解决方案(尽管我不完全确定为什么 VLC 优于其他方法)。

谢谢你。

编辑:

以下是终端上的错误消息片段。前几帧似乎有问题,但我不知道为什么该流在 VLC 上有效。从客户端,我首先发送一个默认的关键帧数据,然后发送视频源 h264 数据。

[h264 @ 0x7f9c50020200] top block unavailable for requested intra mode -1
[h264 @ 0x7f9c50020200] error while decoding MB 7 0, bytestream 7208
[h264 @ 0x7f9c50020200] top block unavailable for requested intra mode -1
[h264 @ 0x7f9c50020200] error while decoding MB 8 9, bytestream 7381
Run Code Online (Sandbox Code Playgroud)

zin*_*rod 6

您可以使用ffmpeg进行流式传输。

首先在终端中测试 ffmpeg 流。在 linux 中,我们使用v4l2从相机抓取帧。

服务器:

ffmpeg -f v4l2 -i /dev/video0 -preset ultrafast -vcodec libx264 -tune zerolatency -b 900k -f h264 udp://127.0.0.1:5000
Run Code Online (Sandbox Code Playgroud)

客户

ffplay udp://127.0.0.1:5000
Run Code Online (Sandbox Code Playgroud)

如果您能够在客户端查看流,那么我们可以使用 OpenCV 进行图像处理。OpenCV 必须有 ffmepg 支持。请参阅此链接以获取 ffmpeg 支持检查。

    cap = cv2.VideoCapture('udp://127.0.0.1:5000',cv2.CAP_FFMPEG)
    if not cap.isOpened():
        print('VideoCapture not opened')
        exit(-1)

    while True:
        ret, frame = cap.read()

        if not ret:
            print('frame empty')
            break

        cv2.imshow('image', frame)

        if cv2.waitKey(1)&0XFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)