学习随笔:摄像头采集数据后进行视频编解码的常见概念与疑问

一、GOP

1、含义

GOP 是视频编码中一个非常重要的概念,全称是 Group of Pictures(图片组)。

通俗理解:

整本书 = 整个视频

章节 = GOP(图片组)

页面 = 帧(Frame)

2、GOP的组成

一个GOP包含三种类型的帧:

1、I帧(关键帧) ---- Intra Frame

特点:完整独立的帧,不依赖其他帧

压缩率:低(占用空间大)

作用:随机访问的入口点
2、P帧(预测帧) ---- Predicted Frame

特点:基于前一帧(I帧或P帧)进行预测编码

压缩率:中等

作用:提高压缩效率
3、B帧(双向预测帧) ---- Bi-directional Frame

特点:基于前后帧进行预测

压缩率:高

作用:进一步提高压缩效率

3、GOP的长度(gop_len)

短GOP(如:gop_len = 30)
含义:每30帧一个I帧

优点:Seek快,容错性好

缺点: 文件体积大

应用: 直播、视频会议
长GOP(如:gop_len = 250)
含义:每250帧一个I帧

优点: 压缩率高,文件小

缺点: Seek慢,容错性差

应用: 视频存储、点播

4、实际应用场景

二、YUV and RGB

1、两者对比

格式 BGR (CV_8UC3) NV12 (YUV420SP)
数据类型 每像素 3 通道(8bit) Y 分量 + UV 半分辨率交织
存储格式 B,G,R 连续存储(3字节/像素) Y 平面 + (UVUVUV...)
颜色空间 RGB 颜色空间 YUV420(亮度+色度)
内存占用 大(3 bytes/pixel) 小(1.5 bytes/pixel)
使用场景 OpenCV内部处理、图像算法 视频编解码、视频传输、摄像头采集

绝大多数现代视频编码器都要求输入YUV格式(尤其是YUV420系列,如NV12),而不是直接处理BGR或RGB。

2、为什么视频编码器偏爱YUV(尤其是NV12)

这背后有三个核心原因:人类视觉系统、带宽效率和硬件优化。

a、人类视觉系统的特性(理论基础)

人眼对亮度的敏感度远高于对颜色的敏感度。

亮度 决定了图像的细节、轮廓和明暗对比。如果亮度信息丢失,图像会变得模糊不清。

色度 决定了图像的颜色。即使色度信息减少一半,人眼也很难察觉出明显的质量下降。

YUV格式的Y分量代表亮度,U和V代表色度,完美地契合了这一特性。因此,我们可以对色度信息进行"子采样"来压缩数据。

b、带宽和压缩效率(直接动力)

BGR格式每个像素需要3个字节。而NV12(属于YUV420) 通过色度子采样,平均每个像素仅需1.5个字节。

数据量的对比:

BGR/RGB: 宽度 × 高度 × 3 字节

NV12 (YUV420): 宽度 × 高度 × 1.5 字节

**结果:**在编码器开始其复杂的压缩算法(如H.264/HEVC)之前,仅仅通过转换到NV12格式,你就已经把数据量减少了50%! 这为后续的编码提供了更小的"原材料",极大地提高了压缩效率,是视频文件远小于图像序列的根本原因之一。

c、硬件和生态系统的支持(现实驱动)

**摄像头传感器:**绝大多数手机、摄像头和网络摄像头的传感器原生输出的就是YUV420格式的数据(通常是NV12或NV21)。直接使用这些数据避免了额外的转换开销。

硬件编码器:Intel Quick Sync、NVIDIA NVENC、AMD VCE以及移动芯片上的编码器,其设计输入就是YUV420格式。如果你强行输入BGR,驱动或编码库通常会在内部先将其转换为YUV,然后再进行编码,这反而会增加CPU负担和延迟。

**视频编码标准:**像H.264、H.265(HEVC)、VP9等主流编码标准,其算法和块结构都是基于YUV色彩空间设计的,特别是处理亮度和色度分离的方式。

结论:对于典型的视频应用,标准的工作流程是:

采集 (NV12/YUV) → [可选:转换为BGR进行处理] → [处理后再转回NV12] → 编码 (H.264/H.265等) → 传输/存储

NV12 → BGR: 当你从摄像头获取到NV12数据后,想用OpenCV显示或处理它,你需要调用cv::cvtColor(nv12_data, bgr_data, CV_YUV2BGR_NV12)。

BGR → NV12: 当你用OpenCV处理完一张图像,想用硬件编码器将其编码为H.264/H.265视频时,你需要先将其转换为NV12(或类似格式)。、

三、摄像头数据采集、处理流程

关键区分:

1、图像色彩格式 - "我们如何描述颜色?"

角色: 这是最底层的数据表示层。
**内容:**RGB、YUV就是这一层的概念。它定义了像素点的颜色是如何由几个分量(如R/G/B或Y/U/V)构成的。这通常是摄像头传感器输出后,经过初步处理得到的原始图像数据。

2、视频编码格式 - "我们如何大幅压缩它?

角色: 这是核心的压缩层。
**内容:**编码器(如H.264、H.265、AV1)接收一连串的YUV图像帧。它运用复杂的算法(如运动估计、帧内预测、变换量化等)去除画面在空间和时间上的冗余信息,将庞大的原始数据压缩到一个极小的体积。输出的是一个被称为"码流"的、经过压缩的二进制数据。

3、视频容器格式 - "我们如何打包和运输它?"

角色: 这是最终的封装和组织层。
内容: 容器(如MP4、MKV、FLV)就像一个盒子。它会把第2步生成的视频编码码流,连同同样经过压缩的音频码流(如AAC、MP3)、字幕、元数据(如标题、分辨率、封面)等,按照一定的结构规则打包在一起,形成一个单独的文件。
**关键点:**容器本身不关心视频和音频是用什么编码的,它只负责"装货"。一个MP4文件里既可以装H.264视频,也可以装H.265视频。

相关推荐
LXY_BUAA3 小时前
《C++学习》Qt软件安装_20260123
学习
觉醒大王3 小时前
医学好投的普刊分享
前端·论文阅读·深度学习·学习·自然语言处理·学习方法
鄭郑4 小时前
【Playwright 学习笔记 05】Xpath选择
笔记·学习
wdfk_prog4 小时前
[Linux]学习笔记系列 -- [drivers][base]syscore
linux·笔记·学习
Black蜡笔小新4 小时前
视频汇聚平台EasyCVR智慧社区全场景可视化管控与智能安防实践
音视频
呱呱巨基4 小时前
Linux Ext系列文件系统
linux·c++·笔记·学习
zpedu5 小时前
给大家普及一下,1月才开始PMP的强度
学习
ooo-p5 小时前
FPGA学习篇——Verilog学习之“流水灯”
学习·fpga开发
代码游侠6 小时前
学习笔记——嵌入式系统通信基础及串口开发
运维·arm开发·笔记·单片机·嵌入式硬件·学习