¿Por qué OpenCV+GStreamer se retrasa exactamente dos segundos con respecto al tiempo real?

¿Por qué OpenCV+GStreamer se retrasa exactamente dos segundos con respecto al tiempo real?

Estoy intentando capturar transmisión en vivo a través de una cámara h264 con protocolo RTSP. En una terminal, lo siguientegst-lanzamiento-1.0El comando proporciona información casi en tiempo real:

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

Cuando introduzco el uri convertido en OpenCV VideoCapture, funciona pero siempre tiene exactamente dos segundos de retraso. Las dos URL siguientes parecen dar el mismo resultado:

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

¿Existe algo así como que OpenCV mantiene un búfer del video? ¿O le falta algo a la URL convertida? Si el primer caso es cierto, ¿se puede eliminar el búfer?

Respuesta1

También tuve dificultades para obtener esa latencia de 2 segundos.

Según tengo entendido en este momento, su indicador "latencia = 0" no se analiza debido a que Gstreamer utiliza de forma predeterminada rtspsrc sin parámetros debido a que no puede analizar su tubería con uridecodebin. Intente ejecutar su programa con niveles crecientes de GST_DEBUG así: "GST_DEBUG=1 ./yourprogram", "GST_DEBUG=2 ./yourprogram", etc. para ver dónde sale mal. En mi caso terminé usando

    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);

Si bien sé que esta pregunta es de hace un par de meses, espero que esta respuesta ayude a otros.

información relacionada