3

我正在尝试将 1080p 网络摄像头的视频录制到文件中。我在视频中设置了一个计时器,并且在每次试验中,视频播放器报告的时间戳(我使用的是 VLC)与视频中的时间不同步。它总是关闭几秒钟(通常视频内计时器比播放器报告的时间快)。

如下所示,我将 C++ 程序设置为在一个线程中捕获视频,并在另一个线程中录制。这工作正常,因为我的 CPU 使用率约为 200%(可能最大?)。我使用的是配备 OS X 10.8 @ 1.8 GHz Intel Core i7 的 Macbook Air。

我尝试将帧速率更改为 15fps,这会导致视频非常不稳定/缓慢。我还尝试将CV_CAP_PROP_FRAME_WIDTH&设置CV_CAP_PROP_FRAME_HEIGHT为较低的分辨率,这会导致视频速度变慢。看起来 1080p @ 30fps 可以产生良好的稳定视频,但它的播放速度总是比预期的要快。之后我也尝试过waitKey(10);record << frame;但它没有影响任何东西。

有关如何使视频及时匹配的任何建议?

谢谢!阿卡什

#include "opencv/cv.h"
#include "opencv/highgui.h"
#include <boost/thread.hpp>

using namespace cv;

void captureFunc(Mat *frame, VideoCapture *capture){
    for(;;){
        // get a new frame from camera
        (*capture) >> (*frame);
    }
}

int main(int, char**)
{
    VideoCapture capture(0); // open the default camera
    if( !capture.isOpened() )  {
        printf("Camera failed to open!\n");
        return -1;
    }

    capture.set(CV_CAP_PROP_FPS,30); //set capture rate to 30fps
    Mat frame;
    capture >> frame; // get first frame for size

    // initialize recording of video
    VideoWriter record("test.avi", CV_FOURCC('D','I','V','X'), 30, frame.size(), true);
    if( !record.isOpened() ) {
        printf("VideoWriter failed to open!\n");
        return -1;
    }

    boost::thread captureThread(captureFunc, &frame, &capture); //start capture thread

    sleep(1); //just to make sure capture thread is ready

    for(;;)
    {
        // add frame to recorded video
        record << frame;
    }

    return 0;
}
4

2 回答 2

10

经过一番调试,我解决了我的问题;VideoWriter 对输入帧的速率很挑剔,这是一个问题。

于 2013-06-28T00:14:24.410 回答
1

您需要同步您的读写功能。您的代码尽可能快地读取,并尽可能快地写入。您的输出视频可能看起来很慢,因为写入输出比读取输入更快(因为capture >>正在等待您的相机),并且记录了几个相同的帧。

无需等待或同步即可编写意味着您可能会多次编写相同的内容(我认为这里正在发生的事情),或者丢失帧。

如果你想继续拥有线程,你可以,但你需要让你的写过程等到有的东西要写。

同样,为了避免丢失帧或写入损坏的帧,您需要读取过程等到写入完成,以便frame可以安全地覆盖。

由于线程无论如何都需要相互等待,所以线程根本没有意义。

我宁愿推荐这种更简单的方法:

for (;;) {
    capture >> frame;
    process(frame);  // whatever smart you need
    record << frame;
}

如果您需要并行性,您将需要更复杂的同步机制,也许您的帧需要某种先进先出。

于 2016-06-28T12:53:04.423 回答