05-编码篇-H264文件分析

通过前面的分析,我们可以看出常规情况下,是将视频以帧的单位进行处理,比如I帧,P帧,B帧等。

但是这些帧是如何以文件方式保存的呢,这节我们主要对H264的保存方式作一个了解。

一帧图片通过编码后,会编码成一个片或多个片slice。但是为什么会有图像切片,原因如下

(1)鲁棒性良好,把一张图片分成一个个独立的slice,在解码时遇到错误,也可以实现再同步,减少错误蔓延,而代价仅仅是失去了一个slice。

(2)匹配MTU(Maximum Transmission Unit)大小,这涉及到网络层的概念,网络上发包时,每个包的大小受到限制,把图像分割成slice可以减小打包的大小。

(3)并行处理,由于每个slice相互独立的缘故,编码、解码以至环路滤波均可以并行处理,加快处理速度,提高效率。

slice切片以NALU行式保存,如下:在存储过程中,一个切片前面还会对应一个NALU头部

图1 切片以NALU方式保存

h264的文件序列如下

图2 文件保存方式

RBSP叫原始字节序列负荷:封装于网络所抽象单元的数据。

一般情况下,一帧图像包括多个切片,一个切片又包括切片头和切片数据,一个切片数据是由多个宏块Macroblock构成,宏块又包括宏块类型、预测类型、CPB、QP和宏块数据,而宏块数据是就是YUV的颜色分量。h264是以NALU形式保存,保存方式如图1和图2所示。另外一帧视频的细节是怎样的,可以查看下图的分解步骤。

图3 一帧图像由宏观到微观描述

下面的图片是h264的码流分层结构的具体细节

在一个h264视频中,最前面的数据是起始码,起始码是在NALU头部之前,假如NALU对应的Slice为一帧的开始,用十六进制00,00,00,01四个字节表示,否则用00,00,01的三个字节表示。另外在编码中,每遇到两个00 00 就会在其后插入一个03字节,保证干扰起始码的确认。在解码过程删除03字节。

最后描述的是视频序列,图像,切片,宏块,子块之前的关系。如下图所示

一个h264文件中相应的存储方式图如下:

上图中的几个概念,描述如下:

序列参数集SPS:包括一个图像序列的所有信息,即两个 IDR 图像间的所有图像信息,如图像尺寸、视频格式等

picture参数集PPS:包括一个图像的所有分片的所有相关信息, 包括图像类型、序列号等,解码时某些序列号的丢失可用来检验信息包的丢失与否

下面打开一个h264文件,可以看出,绿框所描述的是起始码,而箭头所示的67表示SPS开头,68表示PPS开头,65表示I帧的开头

整个文件大概内容如下。而帧内部的slice区分靠000001起始码。

相关推荐
美狐美颜SDK开放平台22 分钟前
多终端适配下的人脸美型方案:美颜SDK工程开发实践分享
人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
饭饭大王6663 小时前
CANN 生态深度整合:使用 `pipeline-runner` 构建高吞吐视频分析流水线
人工智能·音视频
晚霞的不甘5 小时前
CANN 编译器深度解析:TBE 自定义算子开发实战
人工智能·架构·开源·音视频
愚公搬代码5 小时前
【愚公系列】《AI短视频创作一本通》016-AI短视频的生成(AI短视频运镜方法)
人工智能·音视频
那个村的李富贵6 小时前
CANN赋能AIGC“数字人”革命:实时视频换脸与表情驱动实战
aigc·音视频
晚霞的不甘6 小时前
CANN 支持强化学习:从 Isaac Gym 仿真到机械臂真机控制
人工智能·神经网络·架构·开源·音视频
晚霞的不甘10 小时前
CANN 支持多模态大模型:Qwen-VL 与 LLaVA 的端侧部署实战
人工智能·神经网络·架构·开源·音视频
拾荒的小海螺19 小时前
开源项目:LTX2 高效可控的开源视频生成模型
开源·音视频
EasyGBS1 天前
视频画面模糊、卡顿、丢失?EasyGBS新增“视频质量诊断”功能,告别人工盯屏
视觉检测·音视频·gb28181·花屏·视频质量诊断·蓝屏检测
zhuweisky1 天前
ArkTS实现鸿蒙手机视频聊天、屏幕分享(HarmonyOS)
音视频·harmonyos·鸿蒙开发