前言
从本章开始我们将要学习嵌入式音视频的学习了 ,使用的瑞芯微的开发板
🎬 个人主页:@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
,这个才是重 点!