【FFmpeg实战】H264 NALU分析

news/2024/10/21 11:39:59/

视频序列

img

宏块结构

img

img

NALU分层

H264的主要目标是为了有高的视频压缩比和良好的网络亲和性,为了达成这两个目标,H264的解决方案是将系统框架分为两个层面,

VCL(视频编码层)和 NAL(网络提取层).

  • VCL:包括核心压缩引擎和块,宏块和片的语法级别定义,设计目标是尽可能地独立于网络进行高效的编码。
  • NAL:负责将VCL产生的比特字符串适配到各种各样的网络和多元环境中,覆盖了所有片级以上的语法级别。

img

img

NALU:(Network Abstract Layer Unit)网络抽象层单元。

RBSP:(Raw Byte Sequence Payload)原始字节序列载荷。

SODB:String Of Data Bits (原始数据比特流, 长度不一定是8的倍数,故需要补齐,是由VCL产生)。

SODB是以值为1的一个比特结束,如果没有字节对齐,就用0补齐,所以从后往前第一个值为1的位置就为,SODB的最后一个字节。

逻辑关系:RBSP trailing bits 是拖尾字节,用于字节对齐。

img

其实严格来说,这个等式是不成立的,因为RBSP并不等于NALU刨去NALU Header。严格来说,NALU的组成部分应为:

NALU = NALU Header + EBSP

其中的EBSP为扩展字节序列载荷(Encapsulated Byte Sequence Payload),而RBSP为原始字节序列载荷(Raw Byte Sequence Payload)。那为什么我们上面,没有使用2式而使用了1式呢?那是因为,在h264的文档中,并没有EBSP这一名词出现,但是在h264的官方参考软件JM里,却使用了EBSP。

EBSP相较于RBSP,多了防止竞争的一个字节:0x03。

我们知道,NALU的起始码为0x000001或0x00000001,同时H264规定,当检测到0x000000时,也可以表示当前NALU的结束。那这样就会产生一个问题,就是如果在NALU的内部,出现了0x000001或0x000000时该怎么办?

所以H264就提出了“防止竞争”这样一种机制,当编码器编码完一个NAL时,应该检测NALU内部,是否出现如下左侧的四个序列。当检测到它们存在时,编码器就在最后一个字节前,插入一个新的字节:0x03。

img

这样一来,当我们拿到EBSP时,就需要检测EBSP内是否有序列:0x000003,如果有,则去掉其中的0x03。这样一来,我们就能得到原始字节序列载荷:RBSP。

总结:H264的码流结构如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qrnM4bqz-1687944743240)(https://pica.zhimg.com/80/v2-7447f95d9e86c2a1e424b491e78ef585_720w.png)]

NALU分层结构

img

img

RTP包的NALU类型介绍

单一类型:一个RTP包只包含一个NALU

组合类型:一个RTP包含多个NALU,类型是24 —— 27

分片类型:一个NALU单元分成多个RTP包,类型是28和29

单一NALU的RTP包

img

组合NALU的RTP包

img

分片NALU的RTP包

img

img

H264句法元素解析流程

而当我们拿到RBSP或SODB之后,就可以对照各类型的NALU,去解析它们的语法元素,进而再根据语法元素,重建图像。其中解析语法元素的框图如下:

img

由图可见,解析NALU的各个句法元素并不难,只要根据h264文档对应章节的句法,并配合相应的编解码算法解析即可。

>>> 音视频开发 视频教程: https://ke.qq.com/course/3202131?flowToken=1031864 
>>> 音视频开发学习资料、教学视频,免费分享有需要的可以自行添加学习交流群: 739729163  领取

在这里插入图片描述


http://www.ppmy.cn/news/625682.html

相关文章

数据结构 严蔚敏 版 线性链表c语言实现

LinkList.h typedef int ElemType; typedef int Status;typedef struct LNode {ElemType data;struct LNode * next;}LNode,*LinkList;//当第i个元素存在 把值 通过e返回 Status GetElem_L(LinkList, int, ElemType *);//元素插入 2.8 Status ListInsert_L(LinkList,int ,ElemT…

IDC:爱数再次蝉联备份一体机市场中国品牌第一

IDC最新公布的《中国备份一体机市场预测与分析,2014-2019》市场调查报告显示:2014年,中国备份一体机市场规模达到一亿六千万美元的规模,与2013年的数据相比增长超过14.0%。EISOO(爱数)在备份一体机市场份额为24.0%&…

Oracle Exadata一体机与云计算应用(一)

1. Exadata 1.1 Oracle 云计算简介 随着云计算基础架构的不断成熟,越来越多的企业开始关注云计算的实施,加速部署云计算解决方案,将其IT应用及数据资源迁移到云环境之中。而对于“云”的潜在用户而言,他们最关心的莫过于“云”将如…

机器视觉运动控制一体机应用例程|U盘视觉定位激光打标解决方案

一、应用背景 U盘已普遍成为我们的日常生活或是办公时不可或缺一种办公用品。U盘不仅整体形状小,出门携带方便,而且还有很强的实用属性。例如可以用来存储资料文件、数据等的存储媒介。 随着U盘的市场需求量不断攀升,同时企业对U盘的打标质…

基于启扬RK3288的政务服务一体机硬件方案

随着政府基础建设投入的不断深化,政府聚合人、物、场等要素,整合数据云资源,形成以政务服务为核心的立体大数据,为民众带来更加便捷的服务。24小时政务服务大厅和政务服务一体机正是各地实施智慧政务的有力体现。 政务服务一体机…

Unity VR 开发教程: Oculus 一体机开发 (一) 环境配置(基于 Oculus Integration v46)

文章目录 📕教程说明📕安装 Unity 时需要添加的模块📕设置 Unity 的 Build Settings📕导入 Oculus Integration📕设置 Project Settings⭐通用设置⭐Rendering 设置⭐Identification 设置⭐Configuration 设置⭐XR Plu…

兄弟j220怎么清零_BROTHER 兄弟一体机 复位清除计数器

“无法清洁的错误或错误46防止你从你的兄弟喷墨打印机上打印。这是特别令人沮丧,当你知道有没有理由你不能进行印刷此消息。继续阅读以了解是什么让我这样说,你可以摆脱自己的这个错误。 本指南将专门处理与兄弟喷墨打印机有一个数字键盘上的打印机前部。…

联想微型计算机b540u盘启动,联想IdeaCentre B540p一体机怎么用u盘装机大师u盘装系统...

联想IdeaCentre B540p一体机怎么用u盘装机大师u盘装系统?联想IdeaCentre B540p一体机外观是相框式的,没有底座,能够为用户节省很多桌面使用空间,而且搭载了IVB芯处理器,性能非常强悍,受到了很多家庭用户的喜爱&#x…