[英]Create a simple OpenCV pipeline with GStreamer
我有一條到 UDP 上的 stream 圖像的管道
fps = 20
width = 500
height = 500
out_send = cv2.VideoWriter(
"appsrc ! videoconvert ! "
"video/x-raw,format=I420 ! "
"jpegenc ! rtpjpegpay !"
"udpsink host=127.0.0.1 port=5000",
cv2.CAP_GSTREAMER, 0, fps, (width, height), True
)
while True:
frame = np.random.randint(255, size=(height, width, 3), dtype=np.uint8)
out_send.write(frame)
time.sleep(0.05)
這將啟動管道,但我無法使用以下管道接收。 流媒體不會開始,只是掛起。
gst-launch-1.0 udpsrc port=5000 ! application/x-rtp,media=video,payload=26,clock-rate=90000,encoding-name=JPEG ! rtpjpegdepay ! jpegdec ! videoconvert ! queue ! xvimagesink
但是,如果幀是從網絡攝像頭捕獲的,如下所示
cap_send = cv2.VideoCapture(0)
fps = int(cap_send.get(cv2.CAP_PROP_FPS))
width = int(cap_send.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap_send.get(cv2.CAP_PROP_FRAME_HEIGHT))
while True:
ret, frame = cap_send.read()
if not ret:
break
out_send.write(frame)
然后接收管道啟動並流式傳輸沒有任何問題。
在這兩種情況下,我都會在接收端看到以下消息
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
編輯:
我用GST_DEBUG=3
運行接收管道,看到以下 output
gst_rtp_jpeg_depay_process:<rtpjpegdepay0> discarding data packets received when we have no header
僅當發送管道使用上述原始圖像 / numpy arrays 時才會發生這種情況。
我在這里做錯了什么。 對 gstreamer 非常陌生,需要一些幫助
目標:異步生成 opencv 中生成的 stream 圖像。
@Micka 為我指出了正確的方向。
問題在於幀大小。 我嘗試過 MJPEG 和 H264,兩者都需要 8 的倍數的幀大小(寬度/高度)。Gstreamer 會將它們四舍五入到最接近的第 8 倍數。 如果高度是四舍五入的,則在幀的末端會看到抖動。 如果寬度是圓形的,那么在接收器上會看到一個綠屏。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.