FunnyWii
FunnyWii
Published on 2024-08-02 / 136 Visits
0
0

相机视频流的编码格式

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) or cv::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]

编解码器代码

编解码器类型

文件大小

后缀

‘X’, ‘2’, ‘6’, ‘4’

新的MPEG-4

较小

.mp4

‘P’, ‘I’, ‘M’, ‘I’

MPEG-1

不会特别大

.avi

‘M’, ‘P’, ‘4’, ‘2’

MPEG-4.2

不会特别大

.avi

‘D’, ‘I’, ‘V’, ‘3’

MPEG-3

不会特别大

.avi

‘D’, ‘I’, ‘V’, ‘X’

早期MPEG-4

不会特别大

.avi

‘X’, ‘V’, ‘I’, ‘D’

早期MPEG-4

不会特别大

.avi

‘M’, ‘P’, ‘4’, ‘V’

早期MPEG-4

不会特别大

.m4v

‘T’, ‘H’, ‘E’, ‘O’

Ogg Vorbis

相对较大

.ogv

‘F’, ‘L’, ‘V’, ‘1’

Flash视频

相对较大

.flv

‘M’, ‘J’, ‘P’, ‘G’

Motion JPEG

较大

.avi

‘I’, ‘4’, ‘2’, ‘0’

未压缩的YUV

特别大

.avi

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)


Comment