如何通过OpenCV处理VLC UDP流

时间:2018-06-18 20:20:27

标签: python opencv udp h.264 vlc

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

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

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

我之前曾尝试使用其VideoCapture功能直接流式传输到OpenCV,但出于某种原因,视频会在失真的黑色图像处停止并停止。目前,似乎合并VLC是唯一的解决方案(即使我不完全确定为什么VLC可以在其他方法上工作)。

谢谢。

编辑:

以下是终端上的错误消息片段。看起来前几帧有问题,但我不知道为什么流可以在VLC上工作。从客户端,我首先发送了一个默认的关键帧数据,然后发送视频输入h264数据。

const dotenv = require('dotenv');    
dotenv.config({ path: __dirname + '/../.env' });

1 个答案:

答案 0 :(得分:1)

您可以使用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支持检查,请参阅this link

    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()