【发布时间】:2015-07-13 22:52:09
【问题描述】:
我正在通过提供 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);
摄像头以 20fps 的速度输入视频流。 但如果我像这样以 20fps 的速度阅读:
if (!cap.isOpened()) return;
Mat frame;
cap >> frame; // get a new frame from camera
mutex.lock();
m_imageFrame = frame;
mutex.unlock();
然后会有 3 秒以上的延迟。 原因是捕获的视频首先存储在缓冲区中。当我第一次启动相机时,缓冲区被累积但我没有读取帧。所以如果我从缓冲区读取它总是给我旧帧。 我现在唯一的解决方案是以 30fps 的速度读取缓冲区,这样它会快速清理缓冲区并且不会出现更严重的延迟。
是否有任何其他可能的解决方案,以便我可以在每次启动相机时手动清洁/冲洗缓冲区?
【问题讨论】:
-
为什么要限制为 20fps?你在工作线程中等待吗?
-
是在 cv::VideoCapture 中缓冲你自己的或其他东西吗?
-
@mirosval,是的,我这样做是因为我不想要太多的 cpu...
-
video_capture.set(cv2.CAP_PROP_POS_FRAMES, 0)在每次video_capture.read()调用之前帮助我使用 Python 3、OpenCV 4.2 和 GStreamer 从 USB 摄像头获取最新帧。而CAP_PROP_BUFFERSIZE给出 GStreamerunhandled property警告 -
在每个
video_capture.read()之前设置video_capture.set(cv2.CAP_PROP_POS_FRAMES,0)实际上使我的视频流更加滞后...