目录
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
从本章开始我们将要学习嵌入式音视频的学习了 ,使用的瑞芯微的开发板
🎬 个人主页:@ChenPi
🐻推荐专栏1: 《C++_@ChenPi的博客-CSDN博客》????
🔥 推荐专栏2: 《Linux C应用编程(概念类)_@ChenPi的博客-CSDN博客》???
🛸推荐专栏3:《嵌入式音视频_@ChenPi的博客-CSDN博客》
🌺本篇简介 ?:这章记录编解码的基础理论知识——H264的码流结构
这章我们以一下这个图来讲解H264的码流结构
这个图是我从网上找的?
我们按照这个层级关系来学
?
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的起
始位置。?
MP4 格式没有起始码,而是在图像编码数据的开始使用了 4 个字节作为长度标识,用来表示编码数据的长度,这样我们每次读取 4 个字节,计 算出编码数据长度,然后取出编码数据,再继续读取 4 个字节得到长度,一直继续下去就可以取出所有的编码数据了。
h264的字节流格式,它是没有经过传输协议封装,所以也可以称他为裸流数据!
下一章我们重点讲解这个码流格式里面的NALU单元,也就是我们在本地拿到一个以.264格式的视频文件,我们首先去提取里面的NALU,这个才是重 点!