我目前正在使用Qt和OpenCV从本地文件获取逐帧视频(1920*1280,每秒30帧,未压缩)
bool MainWindow::foo()
{
const std::string name = loadFileName.toStdString();
cv::VideoCapture cap(name);
if(!cap.isOpened())
return false;
cap.set(cv::CAP_PROP_BUFFERSIZE, 3);
cv::Mat frame;
while (cap.isOpened())
{
CHiResTimer timer; // custom timer class
timer.Start();
cap >> frame;
timer.Stop();
QTest::qWait(1);
}
frame.release();
cap.release();
return true;
}
但只有
cap >> frame
线需要 10-12 毫秒,这对我来说太慢了,因为我想做一些处理并以最小的延迟显示 30 fps 视频。我发现 gstreamer 的管道可以帮助更快地读取文件,但我对这个框架绝对不熟悉,所以我不知道是否有必要将它仅用于一个管道。有没有其他方法可以加快阅读速度(即使没有 OpenCV)?
如果您想要 30 fps 输出,那么每帧需要 33 毫秒的时间。
按顺序完成所有操作(读取、处理和显示),您将有 10-12 毫秒的时间用于读取,21-23 毫秒的时间用于进一步处理和显示。如果时间不够,那么两倍快的输入(5-6 毫秒,因此处理和显示需要 27-28 毫秒)不太可能拯救您。处理和显示时间仅增加 22%。
您可能需要使用其他方法来加快速度。例如,如果您有 3 个单独的线程处理帧(并且不执行其他操作),则每个线程都有 100 毫秒的时间来处理帧。