OpenCV VideoWriter Framerate Issue

Estoy intentando grabar un video de una cámara web de 1080p en un archivo. Sostuve un temporizador en el video y en cada prueba la marca de tiempo reportada por un reproductor de video (VLC es lo que usé) no se sincroniza con la hora del video. Siempre está apagado unos segundos (generalmente el temporizador de video es más rápido que el tiempo informado por el jugador).

Como se ve a continuación, configuré el programa C ++ para capturar video en un hilo y grabar en otro hilo. Esto está funcionando bien ya que mi uso de CPU es de ~ 200% (¿máximo posible?). Estoy en un Macbook Air con OS X 10.8 a 1.8 GHz Intel Core i7.

He intentado cambiar la velocidad de cuadros a 15 fps y eso da como resultado un video muy lento / entrecortado. También he intentado establecerCV_CAP_PROP_FRAME_WIDTH & CV_CAP_PROP_FRAME_HEIGHT a una resolución menor y resulta en video lento. Parece que 1080p @ 30fps da como resultado un buen video estable, pero aún así se reproduce siempre más rápido de lo que se supone. También he intentado poner enwaitKey(10); despuésrecord << frame; Pero no afectó nada.

¿Alguna recomendación sobre cómo hacer que el video coincida a tiempo?

¡Gracias! 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;
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta