VideoWriter
类
最近几个项目都需要保存相机图像数据,也就是存成视频。有的要求保存源视频,有的要求保存处理后的视频。
由于图像数据的读取是使用 OpenCV,目标检测框架也是建立在OpenCV的基础上,所以保存图像顺理成章也使用OpenCV。使用 OpenCV 的 VideoWriter
类[2]。
根据操作系统的不同,保存视频使用不同的库,在Linux上,使用FFMPEG;在Windows上,可以使用FFMPEG/MSWF(Microsoft Windows Framework)/DSHOW(DirectShow);在MacOS上则是使用AVFoundation(知识盲区)
根据官方文档,VideoWriter
类其中一个定义如下(有多个重载):
cv::VideoWriter::VideoWriter (const String & filename,
int fourcc,
double fps,
Size frameSize,
bool isColor = true)
filename:Name of the output video file.
fourcc:Concatenates 4 chars to a fourcc code. e.g.
cv::VideoWriter::fourcc('M', 'J', 'P', 'G')
FPS:Framerate of the created video stream.
frameSize:
(width, height)
orcv::Size(width, height)
isColor :是否保存为灰度图
其中 fourcc 支持的编码格式列表可以参考 Video Codecs by FOURCC - fourcc.org (archive.org)。
实例化参考: cv::VideoWriter video("output.avi", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), 10, cv::Size(frameWidth, frameHeight));
随后在循环中,使用video.write(frame);
即可向指定文件中持续写入当前 Frame,要注意 Frame 的宽和高需要和VideoWriter
实例化时设置的宽和高一致,否则保存的视频会打不开。
主流视频编码格式
编码的目的是为了压缩,编码是一种压缩技术方法,可以压缩数据和统一格式。
封装格式也叫容器,将已经编码压缩好的视频轨按照一定格式放到一个文件中,常见格式(后缀)有 mp4、mov、avi、mkv 等。
有博主对这些编码器生成的视频体积做了测试[5]:
H.264和X264
名字里都有个264,在安装OpenCV依赖的时候也无脑安装了X264的依赖,但是一直不知道是个什么东西。
H264隶属于MPEG-4编码。H264的优点是在目前容量是最小的RAW,缺点是编码时需要大量时间。支持硬件加速。
X264是有更优秀算法的H.264/MPEG-4 AVC视频压缩编码格式,其开头的"X"意为"software",是使用CPU软解码的一种视频格式。特征是编码速度快,但解码慢,并相当耗费CPU处理能力。X264不支援硬件加速。
H.264是需要付费的编码格式,而x264是针对业余市场推出的一个免费编码格式,是H.264的子集,能实现H.264的部分功能,是其的一个具体实现。这种编码功能上有诸多限制,比如封装只能mkv、画面不够细腻、去除帧间和帧内预测(Estimation)复杂运算(决定画面转场延迟效应的关键)等,因为功能上的限制,所以总体来说x264的技术水平比H.264要低[6]。
参考文章
[1] 车载前摄像头学习笔记 ———— 视频编码格式_摄像头图像编码类型-CSDN博客
[2] OpenCV: cv::VideoWriter Class Reference
[3] Video Codecs by FOURCC - fourcc.org (archive.org)
[4] 音视频笔记|H264 基础原理介绍 - Eren の 宇宙船 (erenship.com)
[5] opencv图片转换视频文件时的编码问题总结_opencv mp4 编码-CSDN博客
[6] note/book/h264&mpeg/h264与x264区别.md at master · xusongss/note (github.com)