簡體   English   中英

使用 GStreamer 創建一個簡單的 OpenCV 管道

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM