如何通过 OpenCV 处理 VLC UDP 流

How to process VLC UDP stream over OpenCV

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

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

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

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

谢谢。

编辑:

以下是终端错误消息的片段。前几帧似乎有问题,但我不知道为什么流在 VLC 上有效。从客户端,我先发送一个默认的关键帧数据,然后发送video feed 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

您可以使用 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

客户:

ffplay udp://127.0.0.1:5000

如果您能够在客户端查看流,那么我们就可以使用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()