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