由于 opencv 侧重于图像的处理,故其编解码能力一般。只能识别 AVI 封装,以及几种有限的编码方式,如下:
// coder for opencv CV_FOURCC('P', 'I', 'M', '1') = MPEG-1 codec CV_FOURCC('M', 'J', 'P', 'G') = motion-jpeg codec CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec CV_FOURCC('U', '2', '6', '3') = H263 codec CV_FOURCC('I', '2', '6', '3') = H263I codec CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec CV_FOURCC('I', 'Y', 'U', 'V') = IYUV coder
c 风格的读取与存储:
// rw.cpp <pre name="code" class="cpp">int main() { CvCapture * capture; capture = cvCreateCameraCapture(0); //打开摄像头 //capture = cvCreateFileCapture(filename); //打开本地视频 CvVideoWriter *writer; writer = cvCreateVideoWriter("d:\\data\\out.avi", CV_FOURCC('I', 'Y', 'U', 'V'), 25.0, cvSize(640, 480), 1); IplImage * image; image = cvQueryFrame(capture); cvNamedWindow("show", CV_WINDOW_AUTOSIZE); while(image) { cvShowImage("show", image); cvWriteFrame(writer, image); if(cvWaitKey(33)==27) break; cvGrabFrame(capture); image = cvRetrieveFrame(capture); //image = cvQueryFrame(capture); } cvReleaseCapture(&capture); cvReleaseVideoWriter(&writer); cvDestroyWindow("show"); return 0; }
再来个C++ 风格的
// rw.cpp void main() { VideoCapture capture(0); //VideoCapture capture(filename); <pre name="code" class="cpp"> VideoWriter writer("VideoTest.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25.0, Size(640, 480)); Mat frame; while (capture.isOpened()) { capture >> frame; //capture.read(frame); writer << frame; imshow("video", frame); if (cvWaitKey(20) == 27) { break; } } }