為什麼 OpenCV+GStreamer 比實時落後整整兩秒?

為什麼 OpenCV+GStreamer 比實時落後整整兩秒?

我正在嘗試透過 RTSP 協定上的 h264 攝影機擷取即時直播。在終端機上,如下GST-啟動-1.0命令提供幾乎即時的回饋:

gst-launch-1.0 playbin uri=rtsp://IP:PORT/live uridecodebin0::source::latency=0

當我將轉換後的 uri 輸入 OpenCV VideoCapture 時,它可以工作,但總是落後兩秒鐘。以下兩個 URL 似乎給出了相同的結果:

cv2.VideoCapture("uridecodebin uri=rtsp://IP:PORT/live latency=0 ! videoconvert ! appsink")
cv2.VideoCapture("rtsp://IP:PORT/live", cv2.CAP_GSTREAMER)

是否有像 OpenCV 之類的東西正在維護視訊緩衝區?或者轉換後的 URL 是否缺少某些內容?如果第一種情況成立,緩衝區可以刪除嗎?

答案1

我也很難獲得 2 秒的延遲。

據我目前的了解,您的“latency=0”標誌未被解析,因為 Gstreamer 預設為不帶參數的 rtspsrc,因為無法使用 uridecodebin 解析您的管道。嘗試以增加的 GST_DEBUG 等級來執行您的程序,如下所示:「GST_DEBUG=1 ./yourprogram」、「GST_DEBUG=2 ./yourprogram」等...以查看哪裡出了問題。就我而言,我最終使用了

    std::string pipe =  "rtspsrc location=rtsp://192.168.1.113:554/user=admin_password=_channel=1_stream=1.sdp latency=0 ! decodebin ! videoconvert ! appsink";
    cv::VideoCapture cap(pipe, cv::CAP_GSTREAMER);

雖然我知道這個問題是幾個月前提出的,但我希望這個答案對其他人有幫助。

相關內容