Problem z ramkami wideo OpenCV VideoWriter

Próbuję nagrać wideo z kamery internetowej 1080p do pliku. Trzymałem zegar w filmie i przy każdej próbie sygnatura czasowa zgłoszona przez odtwarzacz wideo (VLC jest tym, czego użyłem) nie synchronizuje się z czasem w filmie. Zawsze jest wyłączony przez kilka sekund (zwykle zegar wideo jest szybszy niż czas zgłoszony przez gracza).

Jak widać poniżej, skonfigurowałem program C ++ do przechwytywania wideo w jednym wątku i nagrywania w innym wątku. Działa to dobrze, ponieważ moje użycie procesora wynosi ~ 200% (możliwe maksimum?). Jestem na MacBooku Air z systemem OS X 10.8 @ Intel Core i7 1,8 GHz.

Próbowałem zmienić ilość klatek na sekundę na 15 klatek na sekundę, co skutkuje bardzo niestabilnym / powolnym wideo. Próbowałem również ustawićCV_CAP_PROP_FRAME_WIDTH & CV_CAP_PROP_FRAME_HEIGHT do niższej rozdzielczości i powoduje powolne odtwarzanie wideo. Wygląda na to, że 1080p @ 30 klatek na sekundę daje dobry, stabilny obraz, ale zawsze jest odtwarzany szybciej niż powinien. Próbowałem także wprowadzićwaitKey(10); porecord << frame; ale nic na to nie wpłynęło.

Jakieś zalecenia dotyczące dopasowania filmu w czasie?

Dzięki! 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