opencv VideoWriter保存视频失败原因

本文介绍了在使用OpenCV的VideoWriter类时遇到无法打开的问题及其原因。主要涉及两个方面:一是确保文件名正确指定了封装格式,如.avi;二是确认系统支持指定的编码格式,例如MJPEG。此外,还提供了如何查询ffmpeg支持的编解码器的方法。

opencv 中,VideoWriter类 如果不能成功打开(也就是说 .isOpened()返回为false), 通常有两类主要原因。

1. 封装支持

           保存文件名需要写明保存文件的封装格式,后缀为 .avi 可以成功打开编码器,本人试用过 .mp4, 未能打开。

2.编码格式支持

          VideoWriter构造函数的第二个参数是一个代表编码格式的整数,它是通过指名编码格式的名称来转换的。例如

          如果你不能正常保存视频,也有可能是你的系统没有对应的编码库。 指的是MJPEG 编码格式,那么需要你的系统里支持MJPEG编码(光支持解码是不够的)。本人的系统里面安装了ffmpeg(本人其他博文有ffmpeg 的安装方法), 在我编译opencv库时已经配置了这一选项。因此ffmpeg支持的编解码库,我的opencv 也是支持的。

          ffmpeg -codecs  查询ffmpeg支持的编解码形式

         例如: 查询是否支持264编码

ffmpeg -codecs | grep 264
ffmpeg version 2.2.1 Copyright (c) 2000-2014 the FFmpeg developers
  built on Nov 10 2014 20:48:19 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
  configuration: 
  libavutil      52. 66.100 / 52. 66.100
  libavcodec     55. 52.102 / 55. 52.102
  libavformat    55. 33.100 / 55. 33.100
  libavdevice    55. 10.100 / 55. 10.100
  libavfilter     4.  2.100 /  4.  2.100
  libswscale      2.  5.102 /  2.  5.102
  libswresample   0. 18.100 /  0. 18.100
 D.V.LS h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
最后一行告诉了我  H264只支持啦decoder,  没有encoder ,因此我的opencv 是不能支持264编码的。

如果我使用 CV_FOURCC('A','V','C', '1')参数,那么打开VideoWriter时会提示我无法打开,提示我安装libx264(一个开源的H264编解码库)

但是我使用 CV_FOURCC('D', 'I','V','X') CV_FOURCC(‘M’, 'J', ‘P’, 'G') 都可以正常打开

正常使用案例:

    const char* fileName = "/home/sean/Projects/office_video_3.avi";
    videoWriter = VideoWriter(fileName, CV_FOURCC('D', 'I','V','X'), 30, sizeTemp, true);

   if(!videoWriter.isOpened())
    {
 	cout<< "Error : fail to open video writer\n"<<endl;
	return -1;
    }

为了采集测试样本,昨晚自己在PC上搭了一个简单的DVR(结合了运动检测,因此录了13小时,只用来 500M磁盘空间),晚上11点下班时将它打开,第二天来到办公室,采集到了各位同仁上班的风采。

在使用 OpenCV 的 `VideoWriter` 保存视频时,出现输出文件大小为 0KB 的问题,通常是由于以下几个关键原因导致的: - **视频编码器(fourcc)设置错误**:不同的视频格式(如 AVI、MP4)支持的编码方式不同。例如,MP4 文件通常使用 `MP4V` 或 `XVID` 编码,而 AVI 文件可以使用 `XVID` 或 `MJPG` 编码。如果编码器设置不正确,可能导致无法正确写入视频流。 示例代码: ```cpp int fourcc = cv::VideoWriter::fourcc('X', 'V', 'I', 'D'); // 适用于 AVI 格式 int fourcc_mp4 = cv::VideoWriter::fourcc('m', 'p', '4', 'v'); // 适用于 MP4 格式 ``` - **视频帧尺寸与设定不匹配**:`VideoWriter` 初始化时设定的视频尺寸必须与写入的每一帧尺寸一致。如果处理过程中改变了帧的大小,但未更新 `VideoWriter` 的参数,会导致无法写入数据。 示例代码: ```cpp cv::Size frameSize = cv::Size((int)cap.get(cv::CAP_PROP_FRAME_WIDTH), (int)cap.get(cv::CAP_PROP_FRAME_HEIGHT)); cv::VideoWriter out("output.avi", fourcc, 20.0, frameSize); ``` - **未正确打开 `VideoWriter` 对象**:在某些情况下,即使调用了 `VideoWriter` 的构造函数,其内部状态可能并未成功初始化。可以通过调用 `isOpened()` 方法验证对象是否成功打开。 示例代码: ```cpp if (!out.isOpened()) { std::cout << "VideoWriter 未能成功打开" << std::endl; } ``` - **未正确释放资源**:在视频写入完成后,必须调用 `release()` 方法确保所有缓存数据都被写入文件。否则可能导致输出文件不完整或为空。 示例代码: ```cpp out.release(); cap.release(); ``` - **灰度图像写入时未设置 `isColor=False`**:如果写入的是单通道灰度图像,但未将 `isColor` 参数设为 `False`,会导致格式不匹配,从而无法写入有效数据。 示例代码: ```python out = cv2.VideoWriter('output.avi', cv2.VideoWriter_fourcc(*'XVID'), 20.0, (width, height), isColor=False) ``` - **文件路径或权限问题**:确保目标文件路径存在且程序有写入权限。如果路径无效或没有写入权限,会导致文件创建失败或大小为 0KB。 - **帧率设置问题**:虽然帧率不是直接导致文件大小为 0 的主要原因,但设置为 0 或负数也可能导致初始化失败。建议使用与输入视频一致的帧率,或合理设定输出帧率。 示例代码: ```cpp double fps = cap.get(cv::CAP_PROP_FPS); ``` - **OpenCV 后端支持问题**:某些平台或 OpenCV 构建版本可能对某些编码格式支持不完善。例如,在 macOS 上使用 `MP4V` 编码保存 MP4 文件可能更可靠,而在 Windows 上则更推荐使用 `XVID`。 ###
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值