⭐二、图像篇
视频基本要素:宽、高、帧率、编码方式、码率、分辨率
其中码率的计算:码率(kbps)=文件大小(KB)*8/时间(秒),即码率和视频文件大小成正比
YUV和RGB可相互转换
★YUV(原始数据)
YUV是音视频(编解码)最常用的格式。
YUV 是一种色彩空间的编码格式,用于表述图像或视频帧中的颜色信息。它将颜色分为三个分量:
- Y(亮度,明暗信息)
- U 和 V(色度,分别代表蓝色和红色的偏离度信息,用于编码色彩)
YUV420/422可通过ffmpeg/opencv直接编码成H264编码
-
YUV444 、YUV422 、YUV420
代表 YUV 色彩格式中不同的采样模式,描述了亮度(Y)和色度(U、V)分量在空间中的采样比例。后面的数字代表y、u、v在一个像素中各自占的比例。
444:代表每个像素 都有完整的 Y、U 和 V 数据。也就是说,色度和亮度分辨率是相同的。
422:亮度(Y)仍然是逐像素采样的,但色度(U 和 V)分量是每两个像素水平采样一次,即色度分辨率在水平方向上为亮度的一半。
420:亮度(Y)分量仍然是逐像素采样的,但色度(U 和 V)分量每两个像素水平采样一次,并在垂直方向上每两行采样一次,因此色度的水平和垂直分辨率都是亮度的一半
YUV的数据格式保存有两种分类方式(视频压缩方式 ),即**"空间-间"和"空间-内"。"空间-间"的划分方式主要体现在Y、U、V的 比例不同**;"空间-内"的划分方式主要体现在Y、U、V的比例一定,存储格式不同。
空间-间编码(时空编码)
空间-间编码(也称时空编码)是指对帧之间的相关性进行压缩 。视频是一系列连续的图像帧,其中相邻帧之间通常会有很高的相似度,因此通过只记录帧间的差异可以显著降低数据量,例如帧间预测(P 帧、B 帧)利用前后帧的相关性减少数据存储。此种编码方式常用于视频压缩标准(如H.264、H.265)中的**"帧间预测"**部分。
帧类型
-
I帧 :帧内编码帧,只参考当前帧内容进行压缩 。解码时不需要其他帧,因此是独立的,适合作为关键帧。
-
P帧 :预测帧,通过参考前面一个 I 帧或 P 帧进行编码 ,仅记录与参考帧的差异信息
-
B帧 :双向预测帧,通过参考前后的 I 帧或 P 帧来编码,提高了压缩效率。
空间-内编码(帧内编码)
空间内编码(也称帧内编码)是指在单帧图像内部进行压缩,不参考其他帧。利用图像内部的相似性(如色块、纹理等)来去除冗余信息,只在单个帧内进行压缩。
一般用于视频压缩中的关键帧(I帧)压缩,以确保独立解码
以下是三种不同的YUV图像存储方式。
-
Packet打包
即先存储一个yuv,再存储下一个yuv;
示例 :YUV444 的打包格式可能是
YUV YUV YUV
的顺序;而 YUV422 则是YYUV YYUV
。优点 :读取方便,因为每个像素的颜色分量是连续的。
缺点:存储效率较低,适合在特定的硬件或视频处理中使用。
-
Planar平面(用P简写代表)
先存储y平面,再存储u平面,再存储v平面,即 Y、U、V 分量分开存储,每个分量各占一块"平面"区域。
优点 :适合对每个分量单独进行处理,常用于视频压缩和解码中的计算。
缺点:因为色度平面的数据较少,处理可能会较复杂,但节省空间。
-
Semi-Planner半平面(用NV简写代表)
先存储y平面,再存储uv平面;即Y 平面独立存储,而 U 和 V 分量共享一个平面
优点 :节省存储空间,读取较为方便,因此广泛用于现代视频编解码中。
缺点:虽然节省了空间,但比完全的平面格式稍难以单独处理 U 和 V。
示例:(12代表一个像素点占的bit位数)
★H.264(编码格式)
广泛应用的视频压缩标准。
数据格式
NAL 层(Network Abstraction Layer) + VCL 层(Video Coding Layer)
◆ VCL:H264编码/压缩的核心,主要负责将视频数据编码/压缩,再切分。
◆ NALU = NALU header + NALU payload
-
NAL层
NAL 层是 H.264 编码数据的封装层,用于将编码后的视频数据封装成独立的单元,以便传输和存储。
每一个 NAL 单元(NAL Unit)包含一个NAL 头 和负载数据
NAL单元的起始码(Start Code) 常见为
0x000001
或0x00000001
-
NAL 头(1B):用于描述当前 NAL 单元的类型(如I帧、P帧等)
◆ F(forbidden_zero_bit):1 位,初始为0。当网络识别此单元存在比特错误时,可将其设为 1,以便接收方丢掉该单元。
◆ NRI(nal_ref_idc):2 位,用来指示该NALU 的重要性等级。
◆ Type(nal_unit_type):5 位,指出NALU 的类型
常见的NAL单元类型
-
IDR 帧(NAL Type 5):关键帧,独立解码的 I 帧,用于随机访问。
-
非 IDR 帧(NAL Type 1):用于 P 帧或 B 帧等非关键帧。
-
序列参数集(SPS,NAL Type 7) :包含视频序列的全局参数,如分辨率、帧率等。
-
图像参数集(PPS,NAL Type 8):包含单个或多个图片的参数,如预测模式、量化参数等。
-
负载数据:存储实际的视频编码数据,如帧内预测、帧间预测的数据等。
-
-
VCL层
负责实际的视频数据编码,它将视频图像压缩成基本的编码单元(如宏块、块等),并使用 H.264 的压缩算法生成相应的数据
◆ 压缩:预测(帧内预测和帧间预测)-> DCT变化和量化 -> 比特流编码;
◆ 切分数据,主要为了第三步。"切片(slice)"、"宏块(macroblock)"是在VCL中的概念,一方面提高编码效率和降低误码率、另一方面提高网络传输的灵活性。
◆ 包装成『NAL』。
- Slice(片):每一帧可以由一个或多个 Slice 组成,便于错误恢复。Slice 是一组连续的宏块,每个 Slice 可以独立解码。
- 宏块(Macroblock):H.264 中基本的编码单元,每个宏块包含 16x16 的像素区域,并根据帧内或帧间模式进行编码。
- 块(Block):宏块可以细分为 8x8 或 4x4 的块,用于 DCT 变换和预测。
-
H.264文件封装格式
H.264 编码的数据可以封装在不同的文件格式中,以便在各种应用场景中使用
- 裸流(.264 或 .h264):直接存储 H.264 编码后的 NAL 单元数据,常用于调试和测试。
- MP4 / MOV:一种常见的容器格式,用于存储音视频流,包含更多的元数据(如时间戳、索引等),便于流式播放和快进。
- MPEG-TS(.ts):传输流格式,常用于广播和网络传输,有较好的错误恢复能力。
- MKV :一种开源的多媒体封装格式,支持多种编码格式和多音轨,广泛用于高质量视频存储。
参考文献:https://www.cnblogs.com/say-Hai/articles/18630636