Я приобрел IP-камеру , к которой я пытаюсь подключиться с помощью RTSP. URL-адрес подключения RTSP - rtsp://admin:@192.168.0.27/channel=1&stream=0.554
. Я использую OpenCV
для открытия и отображения потока:
#include <opencv2/opencv.hpp>
int main() {
cv::VideoCapture cap;
if (!cap.open("rtsp://admin:@192.168.0.27/channel=1&stream=0.554")) {
std::cout << "Unable to open video capture\n";
return -1;
}
while(true) {
cv::Mat frame;
auto ret = cap.grab();
cap >> frame;
if (frame.empty()) {
break; // End of video stream
}
cv::resize(frame, frame, cv::Size(640, 480));
// Do other stuff here with frame
cv::imshow("frame", frame);
if (cv::waitKey(10) == 27) {
break; // stop capturing by pressing ESC
}
}
return 0;
}
Когда я запускаю программу, она успешно подключается и отображает несколько кадров, но затем начинает сильно отставать и обычно зависает и выводит некоторая подобная ошибка перед сбоем:
[h264 @ 0x558ae8e601a0] error while decoding MB 93 40, bytestream -11
Я не уверен, почему у меня возникают проблемы с постоянным отображением потока. Кроме того, когда он может отображать поток, я обнаружил, что он быстро теряет синхронизацию c (обратите внимание, что я выполняю тяжелую обработку кадра, которая занимает довольно много времени). Например, он не отображает реальный временной интервал, но есть растущая задержка.
Как я могу также гарантировать использование «последнего» кадра и отбросить все остальные, которые могли накопиться в каком-то буфере. Кроме того, есть идеи, почему он дает сбой и как я могу улучшить потоковую передачу?
Мне удалось найти этот SO-пост, который касается получения последнего кадра с помощью gstreamer. Когда я изменяю строку захвата видео для использования gstreamer, она работает немного лучше.
Вот измененная строка подключения: "rtspsrc location=rtsp://admin:@192.168.0.27/channel=1&stream=0.554 ! decodebin ! videoconvert ! appsink max-buffers=1 drop=true"
У меня нет опыта работы с gstreamer, поэтому я не уверен что он делает, но, кажется, улучшает ситуацию. Однако через некоторое время он станет go серым и будет отображать пиксели только при движении, как показано на следующих изображениях. Имея опыт работы с кодеками, я считаю, что опорный кадр отсутствует, но я не совсем уверен. Есть какие нибудь идеи как это починить? Если я не использую правильные параметры gstreamer, пожалуйста, предложите, что я должен использовать для быстрой потоковой передачи (всегда используя последний кадр). Как я уже говорил, у меня минимальный опыт работы с gstreamer. Спасибо за помощь!