Я пытаюсь захватить прямую трансляцию через камеру h264 по протоколу RTSP. На терминале следующее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);
Я понимаю, что этот вопрос задан несколько месяцев назад, но надеюсь, что этот ответ поможет другим.