我能够通过 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
您可以使用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()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句