1080p ウェブカメラからファイルにビデオを録画しようとしています。ビデオでタイマーを保持しましたが、すべての試行で、ビデオ プレーヤー (私が使用したのは VLC) によって報告されたタイムスタンプがビデオの時間と同期しません。常に数秒オフです (通常、ビデオ内タイマーはプレーヤーが報告する時間よりも高速です)。
以下に示すように、あるスレッドでビデオをキャプチャし、別のスレッドで録画するように C++ プログラムをセットアップしました。CPU 使用率が ~200% であるため、これは正常に機能しています (最大出力の可能性はありますか?)。OS X 10.8 @ 1.8 GHz Intel Core i7 を搭載した Macbook Air を使用しています。
フレームレートを 15 fps に変更しようとしましたが、ビデオが途切れたり遅くなったりします。CV_CAP_PROP_FRAME_WIDTH
&を低解像度に設定してみましCV_CAP_PROP_FRAME_HEIGHT
たが、ビデオが遅くなります。1080p @ 30fps ではビデオが安定しているように見えますが、それでも常に想定よりも速く再生されます。waitKey(10);
afterも入れてみましたrecord << frame;
が、何の影響もありませんでした。
ビデオを時間内に一致させる方法に関する推奨事項はありますか?
ありがとう!アカシュ
#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;
}