一年以来,我一直在开发一种处理来自 IP 摄像机的视频流的软件。该软件实时显示视频,还可以录制视频,做一些视频处理等。IP 摄像机可以通过 RTSP 流式传输 MJPEG 或 H264 视频。视频大小为 768x576,25fps。我的问题是当我使用 H264 流时,抓取方法太慢了,需要 30 到 60 毫秒。我的程序不只是抓取帧,所以如果抓取方法需要 50ms,我无法处理 25fps 的视频。我不明白的是我有一台非常强大的计算机 DualCore @3Ghz。有什么方法可以用 OpenCv 快速抓取框架?
这是我的代码的一部分(使用 Qt + home built OpenCv 2.4.1 MinGw):
开始捕获:
videoCapture.open(fileName.toStdString());
queryFrameTimer->start(20);
connect(queryFrameTimer,SIGNAL(timeout()),this,SLOT(queryFrame()));
查询框架方法
void VideoStreamer::queryFrame()
{
qDebug() << QTime::currentTime().toString("mm:ss:zzz") << "queryFrame start";
QTime elapsedTimer;
elapsedTimer.start();
Mat frame;
videoCapture >> frame;
qDebug() <<" VideoStreamer::queryFrame " + QString::number(elapsedTimer.elapsed());
[...]
}
调试输出
"41:07:366" queryFrame start
" VideoStreamer::queryFrame 44 ms"
"41:07:429" queryFrame start
" VideoStreamer::queryFrame 35 ms"
"41:07:493" queryFrame start
" VideoStreamer::queryFrame 37 ms"
"41:07:556" queryFrame start
" VideoStreamer::queryFrame 28 ms"
"41:07:595" queryFrame start
" VideoStreamer::queryFrame 38 ms"
"41:07:648" queryFrame start
" VideoStreamer::queryFrame 42 ms"
"41:07:710" queryFrame start
" VideoStreamer::queryFrame 34 ms"
"41:07:772" queryFrame start
" VideoStreamer::queryFrame 38 ms"
"41:07:835" queryFrame start
" VideoStreamer::queryFrame 28 ms"
"41:07:866" queryFrame start
" VideoStreamer::queryFrame 56 ms"
"41:07:959" queryFrame start
" VideoStreamer::queryFrame 25 ms"
"41:07:990" queryFrame start
" VideoStreamer::queryFrame 60 ms"
"41:08:053" queryFrame start
" VideoStreamer::queryFrame 35 ms"
"41:08:115" queryFrame start
" VideoStreamer::queryFrame 27 ms"
"41:08:147" queryFrame start
" VideoStreamer::queryFrame 64 ms"
"41:08:241" queryFrame start
" VideoStreamer::queryFrame 24 ms"
"41:08:275" queryFrame start
" VideoStreamer::queryFrame 56 ms"
"41:08:335" queryFrame start
" VideoStreamer::queryFrame 50 ms"