Por que o OpenCV+GStreamer está exatamente dois segundos atrás do tempo real?

Por que o OpenCV+GStreamer está exatamente dois segundos atrás do tempo real?

Estou tentando capturar transmissão ao vivo por meio de uma câmera h264 no protocolo RTSP. Em um terminal, o seguintegst-launch-1.0comando fornece feed quase em tempo real:

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

Quando coloco o uri convertido no OpenCV VideoCapture, ele funciona, mas está sempre exatamente dois segundos atrasado. Os dois URLs a seguir parecem fornecer o mesmo resultado:

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

Existe algo como o OpenCV mantendo um buffer do vídeo? Ou está faltando alguma coisa no URL convertido? Se o primeiro caso for verdadeiro, o buffer pode ser removido?

Responder1

Também tive dificuldade em obter aquela latência de 2 segundos.

Pelo que entendi neste momento, seu sinalizador "latency = 0" não é analisado porque o Gstreamer está padronizando rtspsrc sem parâmetros devido a não ser capaz de analisar seu pipe com uridecodebin. Tente executar seu programa com níveis crescentes de GST_DEBUG assim: "GST_DEBUG=1 ./yourprogram", "GST_DEBUG=2 ./yourprogram", etc. para ver onde está errado. No meu caso acabei 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);

Embora eu saiba que esta pergunta é de alguns meses atrás, espero que esta resposta ajude outras pessoas.

informação relacionada