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()來獲取原始二進制數據。
添加回答
舉報