1 回答
TA贡献1830条经验 获得超9个赞
我不是这方面的专家ffmpeg,所以我会听从任何更了解的人的意见,如果证明不正确,我会删除我的答案。
据我所知,您有一个想要摄取到 OpenCV 中的 RTMP 流。OpenCV 使用具有 BGR 排序的 Numpy 数组来存储图像 - 显然还有视频帧,这些图像只是一个接一个的大量图像。因此,我建议您要求ffmpeg将 Flash 视频流转换为 OpenCV 想要的格式:
ffmpeg <RTMP INPUT STUFF> -pix_fmt bgr24 -f rawvideo -
然后更改它,因为它现在是 BGR888:
self.fs = width * height * 3
由于我没有可用的 RTMP 源,因此我生成了如下测试流:
# Generate raw video stream to read into OpenCV
ffmpeg -f lavfi -i testsrc=duration=10:size=640x480:rate=30 -pixel_format rgb24 -f rawvideo -
然后我将其通过管道传输到 Python 中:
ffmpeg -f lavfi -i testsrc=duration=10:size=640x480:rate=30 -pixel_format rgb24 -f rawvideo - | ./PlayRawVideo
Python 程序PlayRawVideo如下所示:
#!/usr/bin/env python3
import numpy as np
import cv2
import sys
# Set width and height
w, h = 640, 480
while True:
data = sys.stdin.buffer.read(w * h *3)
if len(data) == 0:
break
frame = np.frombuffer(data, dtype=np.uint8).reshape((h, w, 3))
cv2.imshow("Stream", frame)
cv2.waitKey(1)
请注意,我必须使用它sys.stdin.buffer.read()来获取原始二进制数据。
添加回答
举报