P2 H264码流结构分析——Annexb与MP4格式的区别 (中)

发布时间:2023年12月22日

前言

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

从本章开始我们将要学习嵌入式音视频的学习了 ,使用的瑞芯微的开发板

🎬 个人主页:@ChenPi

🐻推荐专栏1: 《C++_@ChenPi的博客-CSDN博客》????

🔥 推荐专栏2: 《Linux C应用编程(概念类)_@ChenPi的博客-CSDN博客》???

🛸推荐专栏3:《嵌入式音视频_@ChenPi的博客-CSDN博客
🌺本篇简介 ?:这章记录编解码的基础理论知识——H264的码流结构

这章我们以一下这个图来讲解H264的码流结构

这个图是我从网上找的?

我们按照这个层级关系来学

?

01 Annexb格式

Annexb 格式使用起始码来表示一个编码数据的开始。
起始码他本身不是图像编码的内容,只是用来分隔用的,
而且他是大多数编码器默认输出 的码流格式,它的基本数据单位为NAL 单元,也即 NALU
为了从字节流中提取出NALU ,协议规定,在每个 NALU 的前面加上起始码 。起始码有两
种,一种是 4 字节的 “00 00 00 01” ,一种是 3 字节的 “00 00 01”
这里需要注意一下,由于图像编码出来的数据中也有可能出现 “00 00 00 01” “00 00 01” 的数据。
那这种情况怎么办呢?为了防止出现这种情况
H264 会将图像编码数据中的下面的几种字节串做如下处理:
1 “00 00 00” 修改为 “00 00 03 00”
2 “00 00 01” 修改为 “00 00 03 01”
3 “00 00 02” 修改为 “00 00 03 02”
4 “00 00 03” 修改为 “00 00 03 03”

H264 比特流 = Start_Code_Prefix + NALU + Start_Code_Prefix + NALU + …
这里也说一下为什么需要起始码?
主要是为了将相邻两个 NALU 划分开,让他们有一个界线 , 方便解码,比如将 h264 的数据存储在一个文件当中,解码器无法从数据流中分别每个 NALU 的起
始位置。?

02 RTP格式(也叫MP4格式)

MP4 格式没有起始码,而是在图像编码数据的开始使用了 4 个字节作为长度标识,用来表示编码数据的长度,这样我们每次读取 4 个字节,计 算出编码数据长度,然后取出编码数据,再继续读取 4 个字节得到长度,一直继续下去就可以取出所有的编码数据了。
h264 的字节流格式,它是没有经过传输协议封装,所以也可以称他为裸流数据!
下一章我们重点讲解这个码流格式里面的 NALU 单元,也就是我们在本地拿到一个以 .264 格式的视频文件,我们首先去提取里面的 NALU ,这个才是重 点!

文章来源:https://blog.csdn.net/weixin_73901182/article/details/135118931
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。