Я снимаю видео через веб-камеру, которая передает поток mjpeg. Я сделал захват видео в рабочем потоке. Я начинаю захват следующим образом:
const std::string videoStreamAddress = "http://192.168.1.173:80/live/0/mjpeg.jpg?x.mjpeg";
qDebug() << "start";
cap.open(videoStreamAddress);
qDebug() << "really started";
cap.set(CV_CAP_PROP_FRAME_WIDTH, 720);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 576);
камера подает поток со скоростью 20 кадров в секунду. Но если бы я сделал чтение в 20fps, как это:
if (!cap.isOpened()) return;
Mat frame;
cap >> frame; // get a new frame from camera
mutex.lock();
m_imageFrame = frame;
mutex.unlock();
Тогда есть 3 + секундное отставание. Причина в том, что захваченное видео сначала сохраняется в буфере. Когда я впервые запускаю камеру, буфер накапливается, но я не читал фреймы. Поэтому, если я читаю из буфера, он всегда дает мне старые фреймы. Единственные решения, которые у меня есть сейчас, - это прочитать буфер со скоростью 30 кадров в секунду, чтобы он быстро очистил буфер и не было более серьезного запаздывания.
Есть ли другое возможное решение, чтобы я мог вручную очищать/очищать буфер вручную при каждом запуске камеры?