OpenCV如何将视频保存到文件中。

5
我认为我的问题非常基础,但我正在使用OpenCV编写此代码,以简单地捕获来自网络摄像头的视频数据并将其保存到文件中。现在问题在于,该文件在所需位置被创建后,初始大小约为286字节。然后当我将第一帧分配给指针时,大小会增加到414字节。然而,当我运行整个代码时,保存的视频大小仍为414字节。当然,由于这个原因,我的媒体播放器无法播放该文件,并显示“不是QuickTime Player理解的格式。”VLC播放器也有相同的情况。
以下是相同的代码:
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

int main( int argc, char** argv ) {
CvCapture* capture;

capture = cvCreateCameraCapture(0);

assert( capture != NULL );

IplImage* bgr_frame = cvQueryFrame( capture );

CvSize size = cvSize(
                     (int)cvGetCaptureProperty( capture,
                                               CV_CAP_PROP_FRAME_WIDTH),
                     (int)cvGetCaptureProperty( capture,
                                               CV_CAP_PROP_FRAME_HEIGHT)
                     );

cvNamedWindow( "Webcam", CV_WINDOW_AUTOSIZE );

CvVideoWriter *writer = cvCreateVideoWriter(    "/Users/user/Desktop/OpenCV_trial/OpenCV_trial/vidtry.AVI",
                                            CV_FOURCC('D','I','V','X'),
                                            30,
                                            size
                                            );

while( (bgr_frame = cvQueryFrame( capture )) != NULL ) 
{
    cvWriteFrame(writer, bgr_frame );
    cvShowImage( "Webcam", bgr_frame );
    char c = cvWaitKey( 33 );
    if( c == 27 ) break;
}
cvReleaseVideoWriter( &writer );
cvReleaseCapture( &capture );
cvDestroyWindow( "Webcam" );
return( 0 );
}

我不知道为什么会发生这种情况。我正在使用Mac OSX Lion并运行Xcode。
有人之前遇到过这个问题吗?如果是这样,我该怎么解决?
谢谢!
-Yash

你尝试用另一个播放器打开文件了吗?例如VLC。 - Luca Davanzo
3个回答

2

你好,我认为我找到了问题的答案。

正如Velthune所建议的那样,这似乎是一个编解码器问题,MAC OS只能运行其中的一些。以下是所有可用的编解码器链接: Mac OS支持的QuickTime编解码器列表

然而,并非所有列在那里的编解码器都可以工作。在我尝试的所有编解码器中,只有WRLE似乎可以工作。

非常感谢Velthune。 -Yash


谢谢您提供的链接实例! - Luca Davanzo

1

你尝试用另一个播放器打开文件了吗?例如VLC。

这是因为Quicktime和.avi格式不太兼容。

可以查看苹果的文档

否则,尝试更改视频编解码器,这是opencv的参考资料


是的,VLC也有同样的问题。此外,我认为代码运行方式存在问题,因为文件大小没有增加。另外,我从一篇博客中找到了这段代码,因为我的自己的代码出现了相同的错误。 - yashc
我测试了你的代码,一切正常,视频.avi已经创建,我可以用mplayer打开它(我在Linux下工作,所以我可以测试QuickTime)。 - Luca Davanzo
哦,我认为代码应该没问题。你有添加任何头文件到代码里吗?或者在其他方面调整了代码吗? 我认为问题似乎出在 Xcode 执行代码的方式上,但我不确定。 - yashc
我使用了以下这些头文件:#include <opencv/cv.h>和#include <opencv/highgui.h>。 - Luca Davanzo
好的。那么问题就不在这里了。由于某种奇怪的原因,代码简单地拒绝将数据写入我创建的文件中。 - yashc

0
实际上我也在尝试做同样的事情。但是我是在Windows 7中使用Visual C++(Express Edition)尝试的。但在这种情况下,我们需要添加额外的头文件“#include "stdafx.h"”,并确保保存文件的链接存在。例如,我修改的代码如下:
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

int main( int argc, char** argv ) {
CvCapture* capture;

capture = cvCreateCameraCapture(0);

assert( capture != NULL );

IplImage* bgr_frame = cvQueryFrame( capture );

CvSize size = cvSize(
                     (int)cvGetCaptureProperty( capture,
                                               CV_CAP_PROP_FRAME_WIDTH),
                     (int)cvGetCaptureProperty( capture,
                                               CV_CAP_PROP_FRAME_HEIGHT)
                     );

cvNamedWindow( "Webcam", CV_WINDOW_AUTOSIZE );

CvVideoWriter *writer = cvCreateVideoWriter("D:/vidtry.AVI",CV_FOURCC('D','I','V','X'),15,size);

while( (bgr_frame = cvQueryFrame( capture )) != NULL ) 
{
    cvWriteFrame(writer, bgr_frame );
    cvShowImage( "Webcam", bgr_frame );
    char c = cvWaitKey( 33 );
    if( c == 27 ) break;
}
cvReleaseVideoWriter( &writer );
cvReleaseCapture( &capture );
cvDestroyWindow( "Webcam" );
return( 0 );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接