0

我从网络摄像头开始录制会话,然后我想制作另一个已经录制了 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 时制作视频,包括在 blob 触发前几秒钟的视频。

4

0 回答 0