如何通过OpenCV处理VLC UDP流

发布于 2021-01-29 15:01:35

我能够通过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
关注者
0
被浏览
80
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看