我正在尝试将1080p网络摄像头中的视频录制到文件中。我在视频中设置了一个计时器,在每次试验中,视频播放器报告的时间戳(我使用的VLC)与视频中的时间不同步。它总是关闭几秒钟(通常在视频内定时器比播放器报告的时间更快)。
如下所示,我设置了C ++程序以在一个线程中捕获视频,并在另一个线程中记录。这工作正常,因为我的CPU使用率是~200%(可能最大?)。我使用的是带有OS X 10.8 @ 1.8 GHz Intel Core i7的Macbook Air。
我尝试将帧速率更改为15fps,这会导致非常不稳定/慢速的视频。我也试过设置CV_CAP_PROP_FRAME_WIDTH
& CV_CAP_PROP_FRAME_HEIGHT
分辨率较低,会导致视频速度变慢。似乎1080p @ 30fps会产生良好的稳定视频,但它的播放速度仍然比预期的要快。我也尝试在waitKey(10);
之后加入record << frame;
,但这并没有影响任何事情。
有关如何及时匹配视频的任何建议?
谢谢! 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;
}
答案 0 :(得分:8)
经过一些调试后我解决了我的问题;这是一个问题,VideoWriter对于帧的速率是挑剔的。
答案 1 :(得分:1)
您需要同步您的读写功能。您的代码尽可能快地读取,并尽可能快地写入。您的输出视频可能看起来很慢,因为写入输出比读取输入更快(因为capture >>
正在等待您的相机),并且记录了几个相同的帧。
无需等待或同步即可写入意味着您可以多次写入相同的内容(我认为这里发生了什么),或丢失帧。
如果你想继续拥有线程,你可以,但是你需要让你的写入过程一直等到 new 要写的东西。
同样为了避免丢帧或写入损坏的帧,您需要等待读取过程直到写入完成,以便可以安全地覆盖frame
。
由于线程无论如何都需要相互等待,所以线程中没有什么意义。
我宁愿推荐这么简单的方法:
for (;;) {
capture >> frame;
process(frame); // whatever smart you need
record << frame;
}
如果你需要并行性,你需要更复杂的同步机制,也许你的帧可能有某种fifo。