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.