RTP(载荷H264码流)基础知识

一. H264介绍

  • h264是一种视频压缩标准,经过压缩的帧分为:I,P,B帧:

I帧:关键帧,采用帧内压缩技术,自身可以通过视频解压算法解压成一张单独的完整图片
P帧:向前参考帧,在压缩时,只参考前面已经处理的帧(只需要参考前面的I帧或P帧),采用帧音压缩技术。
B帧:双向参考帧,在压缩时,他既参考前面的帧,又参考他后面的帧(需要同时参考前面和后面的I帧或P帧),采用帧间压缩技术。

  • 除了I/P/B帧外,还有图像序列GOP

两个I帧之间是个图像序列,在一个图像序列中只有一个I帧,如图:

RTP(载荷H264码流)基础知识_第1张图片

在H264基准类中,仅使用I帧和P帧以实现低延时,因此是网络摄像机和视频编码器的理想选择

二.H264原始码流结构

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

VCL数据传输或者存储之前,会被映射到一个NALU中,H264数据包含一个个的NALU,如图

RTP(载荷H264码流)基础知识_第2张图片

一个NALU=一组对应视频编码的NALU头部信息 + 一个原始字节序列负荷(RBSP,RAW Byte Sequence Paload)
一个原始的NALU单元结构包含:
【start code】 + [NALU head] + [NALU payload]三部分,其中start code是一个NALU单元开始,

NAL单元格式如图:
在这里插入图片描述
H.264的编码视频序列包括一系列的NAL单元,每个NAL单元包含一个RBSP。编码片(包括数据分割篇IDR片)和序列RBSP结束符被定义为VCL NAL单元,其余为NAL单元。典型的RBSP单元序列如图2所示。每个单元都按独立的NAL单元传送。每个单元都按独立的NAL单元传送。单元的信息头(一个字节)定义了RBSP单元的类型,NAL单元其余部分为RBSP数据。
RTP(载荷H264码流)基础知识_第3张图片

三 NAL单元

每个NAL单元是一个一定语法元素的可变长字节字符串,包括包含一个字节的头信息(用来表示数据类型),以及若干整数字节的负荷数据,一个NAL单元可以携带一个编码片,A/B/C型数据分割或一个学列或一个图像集。
NALU头有一个字节组成,它的语法如下:
RTP(载荷H264码流)基础知识_第4张图片
NAL单元按RTP***按序列,其中T为负荷数据类型,占5Bit,R为重要性指示位,占2bit.最后的F为禁止位,占1bit。具体如下:

  • NALU类型位:表示NALU的32种不同类型的特征,类型1-12是H.264定义的,类型24-31是用于H.264以外的,RTP负荷规范使用这其中的一些值来定义包聚合和分裂,其他值位H.264保留。
  • 重要性只是位:用于在重构过程中标记一个NAL单元的重要性,值越大,越重要。值位0表示这个NAL单元没有用于预测,因此可被解码器抛弃而不会有错误扩散;值高于0表示NAL单元要用于无漂移重构,且值越高,对此NAL单元丢失的影响越大。
  • 禁止位:编码中默认值为0,当网络识别此单元中存在比特错误时,可将其设为1,以便接收方丢掉该单元,主要用于适应不同种类的网络环境(比如有线和无线相结合的环境)。
264常见的帧头数据为:

00 00 00 01 67 (SPS) 0110 0111

00 00 00 01 68 (PPS) 0110 1000

00 00 00 01 65 ( IDR 帧) 0110 0101

00 00 00 01 61 (P帧) 0110 0001

上述的67,68,65,61,还有41等,都是该NALU的识别等级。
F:禁止位,0表示正常,1表示错误,一般都是0;
NRI:重要级别,11表示非常重要。
TYPE:表示该NALU的类型是什么,见下表,由此可知7位序列参数集(SPS),8为图像参数集(PPS),5代表I帧,1代表非I帧。
由此 可知。61和41其实都是P帧(type值为1).重要级别不一样,(它们的NRI一个是11BIN,一个是10BIN)。
NALU类型是我们判断帧类型的利器,从官方文档中得出下图:
RTP(载荷H264码流)基础知识_第5张图片

四.H264帧判断

RTP(载荷H264码流)基础知识_第6张图片
最上面图的码流对应的数据层层分析,以00 00 00 01分割之后的下一个字节就是NALU类型,将其转为二进制数据后,解读顺序从左往右算,如下:

  • 第1位为禁止位,值为1表示语法错误
  • 第2,3位为参考级别
  • 第4-8位是NAL单元类型。

判断是否位I帧的算法位:
NALU类型 & 0001 1111 //5为I帧,7是sps 8是pps

你可能感兴趣的:(linux,c语言)