Problema de Framerate do OpenCV VideoWriter

Eu estou tentando gravar vídeo de uma webcam de 1080p em um arquivo. Eu segurei um temporizador no vídeo e em cada tentativa o timestamp relatado por um player de vídeo (VLC é o que eu usei) não sincroniza com o tempo no vídeo. É sempre desligado alguns segundos (geralmente o temporizador no vídeo é mais rápido do que o tempo relatado pelo jogador).

Como visto abaixo, eu configurei o programa C ++ para capturar vídeo em um thread e gravar em outro thread. Isso está funcionando bem, pois o uso da minha CPU é de ~ 200% (máximo possível)? Eu estou em um Macbook Air com OS X 10.8 @ 1.8 GHz Intel Core i7.

Eu tentei alterar o framerate para 15fps e isso resulta em vídeo muito instável / lento. Eu também tentei definirCV_CAP_PROP_FRAME_WIDTH & CV_CAP_PROP_FRAME_HEIGHT para uma resolução mais baixa e resulta em vídeo lento. Parece que 1080p @ 30fps resulta em um bom vídeo estável, mas ainda é sempre reproduzido mais rápido do que deveria. Eu também tentei colocar emwaitKey(10); depois derecord << frame; mas isso não afetou nada.

Alguma recomendação sobre como fazer com que o vídeo corresponda a tempo?

Obrigado! 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;
}

questionAnswers(2)

yourAnswerToTheQuestion