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