2

一年以来,我一直在开发一种处理来自 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" 
4

0 回答 0