OpenCV VideoWriter Проблема с частотой кадров

Я пытаюсь записать видео с веб-камеры 1080p в файл. Я держал таймер в видео, и в каждом испытании метка времени, сообщаемая видеопроигрывателем (VLC - это то, что я использовал), не синхронизируется со временем в видео. Он всегда отключен на несколько секунд (обычно таймер в видео быстрее, чем время, указанное игроком).

Как показано ниже, я настроил программу C ++ для захвата видео в одном потоке и записи в другом потоке. Это работает нормально, так как загрузка моего процессора составляет ~ 200% (возможно, максимальный выход?). Я работаю на Macbook Air с OS X 10,8 @ 1,8 ГГц Intel Core i7.

Я попытался изменить частоту кадров до 15 кадров в секунду, и это приводит к очень прерывистому / медленному видео. Я также пытался установитьCV_CAP_PROP_FRAME_WIDTH & CV_CAP_PROP_FRAME_HEIGHT к более низкому разрешению, и это приводит к медленному видео. Похоже, что 1080p при 30 кадрах в секунду дает хорошее устойчивое видео, но оно все равно всегда воспроизводится быстрее, чем предполагалось. Я также пытался положить вwaitKey(10); послеrecord << frame; но это ни на что не повлияло.

Любые рекомендации о том, как сделать видео совпадающим по времени?

Спасибо! Aakash

#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;
}

Ответы на вопрос(2)

Ваш ответ на вопрос