当我们写下面测试代码时候:
#include <opencv2/opencv.hpp>int main() {cv::VideoCapture cap("E:\\car.mp4"); // 打开默认摄像头if (!cap.isOpened()) {std::cout << "读取完毕!" << std::endl;return -1;}double fps = cap.get(cv::CAP_PROP_FPS);int width = cap.get(cv::CAP_PROP_FRAME_WIDTH);int height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);std::cout << "FPS : " << fps << std::endl;std::cout << "Width : " << width << std::endl;std::cout << "Height : " << height << std::endl;// 获取摄像头的帧率// 设置视频保存路径和编码格式cv::VideoWriter writer("output.mp4", cv::VideoWriter::fourcc('X', '2', '6', '4'), fps, cv::Size(width, height));cv::Mat frame;while (true) {cap >> frame; // 从摄像头读取新的帧if (frame.empty()) {std::cerr << "ERROR: 帧获取失败" << std::endl;break;}writer.write(frame); // 将帧写入视频cv::imshow("Frame", frame);if (cv::waitKey(5) >= 0)break;}// 释放资源cap.release();writer.release();cv::destroyAllWindows();return 0;
}
结果发现无法写出视频,原因是h264由于版权限制没有被ffmepg支持,而opencv又是依据ffmepg编译的,至今都不能被支持,报错截图:
因此我查阅了很多资料,根据官方issue建议重新编译ffmpeg源码才行,而且又得与opencv适配非常麻烦,虽然理论可行,但是这个不是比较懂底层编程的人很难完成,而且我发现网上都是理论上讲解从来没有一个弄出来可以用的库。因此这个办法显然不靠谱,后面我找到一个简单方法,只需要集成到opencv库里面即可。这个库(已经包含完整opencv库和集成的库,直接引用即可)下载地址如下:
https://download.csdn.net/download/FL1623863129/89112613
最后我运行上面一模一样的代码,成功保存h264格式视频 ,提示明显和以前不一样,而且保存视频可以正常用potplayer打开
注意上面提示不支持自动切换成avc1,avc1格式也是h264编码一种,这次可以成功保存视频了而且发现比mp4v,xvid等编码小了很多。注意我的测试环境为:
vs2019
opencv4.7.0 x64库