从视频文件录制中复制帧

时间:2013-02-01 17:21:38

标签: c++ opencv

我从网络摄像头开始录制会话,然后我想创建另一个已经录制了200帧的文件,然后是网络摄像头中的其他实时帧。

我这是为了从正在录制的“Blob.avi”文件中获取帧:

        VideoWriter writeVideo;

        VideoCapture savedVideo;
        savedVideo.open("E:\\Blob.avi");

        int startFrame = savedVideo.get(CV_CAP_PROP_FRAME_COUNT);
        cout << " startFrame:"<< startFrame;
        startFrame -= 200; 
        savedVideo.set(CV_CAP_PROP_POS_FRAMES,startFrame);
        cout <<"-"<< startFrame << " ms: " << savedVideo.get(CV_CAP_PROP_POS_MSEC) << endl;

        sprintf_s(filename,150, "E:\\FramesTest.avi");
        writeVideo.open(filename,xvid, 10, Size(640,480));
        Mat tempPic;
        for( int i = 0; i < 200; i++ ){
            savedVideo >> tempPic;
            writeVideo.write(tempPic);
        }
       //then add realtime frames.

问题在于它无法读取正在录制的文件中的总帧数:它给出了0和ms。这样它就可以实时启动新文件记录,而无需先复制另一个文件的200帧。

我认为问题在于文件视频正在使用中。 那么如何从未发布的文件视频中复制一些帧?

编辑: 我必须添加至少30毫秒的延迟:

        for( int i = 0; i < 200; i++ ){
            savedVideo >> tempPic;
            writeVideo.write(tempPic);
            Sleep(30)
        }

这种方式也适用,如果它从第0帧开始减去200而不是从最后一帧减去200。 但它很慢:我放松了大约10秒的实时捕获。 还因为每个帧都有重新编码。 所以我认为最好首先记录实时捕获,然后在新创建的文件的开头添加200帧。 我怎样才能做到这一点?可能没有重新编码,在文件级更好。

这样做的目的是在有斑点检测时制作视频,包括触发blob之前的几秒钟视频。

0 个答案:

没有答案