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.