rtp 负载裸h264 数据

来源:互联网 发布:网络老歌曲大全100首 编辑:程序博客网 时间:2024/06/18 08:21

目录
(1)h264 结构背景知识
(2) rtp 的负载格式
 (3)NAL首单元字节使用
(4)打包方式
(5)单个NAL 
(6)聚合包
(7)分片
(8)参考文章
1.h264 结构背景知识
     h264 概念上分成视频编码层(vcl)和网络抽象层(NAL);NAL 编码器封装VCL 编码器输出的片段到网络抽象单元(NAL units),它适合于通过包网络路传输或者用于面向包的多路复用环境。

     对于H264 中的概念从大到小排序是:序列,图像(大多数成为帧,包括 I P B帧),片组,片(包括 I P B 片,SP 片,SI 片),NALU ,宏块,亚宏块,快,像素。
如下图:
在h264 中,分层结构最大的不同是取消了序列层和图像层,并将原来属于序列和图像头部的大部分句法元素游离出来形成序列和图像两集参数集(sps,pps),其余的部分则放到片层。
参数集(sps,pps)是一个独立的数据单位,不依赖与参数集合外的其他句法元素。一个参数集不对应某一个特定的图像或序列,同一个序列参数集可以被多个图像参数集应用,同理,同一个图像参数集也可以被多个图像引用。只在编码器认为需要更新参数集的内容时,才会发出新的参数集。



一个H264序列中可能出现的数据单元:

IDR: 在H264 中,图像以序列为单位进行组织。一个序列的第一个图像叫做IDR 图像(立即刷新图像),IDR图像都是I帧图像,H264 医用IDR 图像是为了解码的重同步,当解码器解码到IDR 图像时,立即将参考帧队列清空,将已经解码的数据全部输出或者抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR 图像之后的图像永远不会使IDR 之前的图像的数据来解码。

1.1 NALU 与帧 slice分片的关系
     NALU单元格式如下:
NAL头格式如下:

其中TYPE (nal_unit_type 5bits)标识 负载RBSP的类型,其中 type 为 1,2,3,4,5 的nal 单元成为VCL 的nal 单元,也就是(I,P,B帧分层数据(slice ))的数据,其他类型的NAL单元为非VCL的nal单元;
0:未规定
1:非IDR图像中不采用数据划分的片段
2:非IDR图像中A类数据划分片段
3:非IDR图像中B类数据划分片段
4:非IDR图像中C类数据划分片段
5:IDR图像的片段
6:补充增强信息 (SEI)
7:序列参数集
8:图像参数集
9:分割符
10:序列结束符
11:流结束符
12:填充数据
13 – 23:保留
24 – 31:未规定

RBSP的类型:
     RBSP 类型致以:包括序列参数集SPS 和图像参数集 PPS;SPS包含的是针对一连续编码视频序列的参数,如标识符 seq_parameter_set_id,帧数,及POC的约束,参考帧数目,解码图像尺寸和帧场编码模式选择标识等;PPS对应的一个序列中某一幅图像或者某几幅图像,其参数如标识符pic_parameter_set_id,可选的seq_parameter_set_id ,熵编码模式选择标识,片组数目,初始量化参数和去方块滤波系数等等。
     


2.rtp 的负载格式

rtp 头格式如下:
根据 RTP 负载格式设置 的rtp 头 信息如下:
Marker bit (M):1 bit
     对于RTP 时间戳指示的访问单元的最后一个包本位进行设置,符合视频格式M的常规使用,已允许有效缓冲处理布局。对于聚合包(STAP,MTAP),RTP 中M位必须设置成最后一个NAL 单元如果被传送在单个RTP 包中时M位对应的值。解码器可以使用本位作为早期最后一个包的指示,但是不可以依赖属性。
     注:运送多个nal单元的聚合包只有一个M位相关联。因此,如果一个网关重新打包一个聚合包为几个包,它可能不会可靠设置这些包M位

sequence number(SN):16 bits
      根据rfc3550 设置使用,对于单个NALU与非交错打包方式,序号用于NALU解码顺序。

Timestamp:32 bits
     rtp 时间戳设置为采样时间戳,必须使用90khz 时钟频率。


2.1 RTP 负载格式的公共结构
     负载格式定义三个不同的基本负载结构。一个接受者可以识别负载结构通过rtp负载的第一个字节,他也共享为rtp负载头,某些情况下,作为负载的第一个字节。本字节总是结构化为NAL 单元头,NAL 单元类型指示目前使用哪个结构,可能的结构如下:

单个NAL单元包:负载中只包含一个NAL单元。NAL头类型域等于原始NAL单元,即在范围1到23 之间;
聚合包:本类型用于聚合多个NAL单元到单个rtp 负载中。 应用场合,由于 以太网优先传输最大单元是254或更少,为了避免单个NAL(size 太小) 包传输 时会被重新打包;
分片单元:用于分片单个NAL 单元到多个RTP 包。应用场合,由于udp mtu 限制:大约是1500 字节,单个NAL 的size 大于1500 所以要分片;
单元类型以及负载结构总结:
3.NAL首单元字节使用
NAL 单元类型字节的格式在下面指出:
F: 1 bit
     0 表示数据没有错误,1 表示数据有错误
NRI:2 bit
     表示此NALU 数据的重要程度,值为00 时,表示此NALU 数据可以被丢弃而不影响解码;
     下面是NRI 值对应的 NAL unit type



4. 打包方式
      打包方式有三种:
(1)单NAL单元方式;所谓的但NAL 单元方式,就是 一个rtp负载就是一个NALU单元
(2)非交错方式;非交错方式 应用在 rtp 负载是聚合包和分片时,聚合包或分片的传输顺序 和解码顺序是一致的
(3)交错方式;交错方式应用在 rtp 负载是 聚合包和分片的场合,聚合包或分片的传输顺序 和 解码顺序 是 不一致的

下表是 每个打包方式允许的NAL单元类型的总结:




5. 单个NAL 单元包
     定义再次的单个NAL 单元包必须包含一个类型定义在【1-23】中的NAL 单元。聚合包和分片单元不可以用在单个NAL单元包中。一个封装单个NAL 单元包到RTP的NAL 单元流的RTP 序号必须符合NAL单元的解码顺序。单个NAL单元包的结构显示如下图:
注意:NAL单元的第一个字节和RTP 负载头第一个字节重合

6. 聚合包

     定义了两类聚合包:
     (1)单时间聚合包(STAP);所谓的单时间,是指这一系列的聚合单元的时间戳是一样的。STAP分成两类,一类不包含DON(解码顺序)的STAP-A,一类包含DON(解码顺序)的STAP-B
     (2)多时间聚合包(MTAP):所谓的多时间,是指一系列的聚合大院的时间戳是不一样的,各个单元由自己的时间戳。MTAP 分成两类,差别在NAL单元时间戳位长度不同

     聚合包的RTP荷载格式的结构如下图:


     MTAPS,STAPS 公用一下打包规则:RTP 时间戳必须设置为被聚合NAL 单元中最早NALU时间。NAL单元类型的类型域必须被设置成适当的值,NRI的值必须是运送在聚合包中NAL单元的最大值。

     rtp 头的marker 位设置为聚合包中最后NAL单元如果单独封装早RTP传输中对应Marker位的值。聚合包的负载由一个或者多个聚合单元组成。一个包聚合包可以运送必要多的聚合单元;但是,聚合包中整个数据显然必须适合于一个IP包,并且大小应该选择时的结果的IP包比MTU 小。一个聚合包不可以嵌套,即一个聚合包包含另一个聚合包
6.1单时间聚合包
     STAP -A 的结构如下:
   STAP-b的结构如下:
DON域指定STAP-B传输顺序中第一个NAL单元的DON值. 对每个后续出现在STAP-B中的NAL单元,它的DON值等于(STAP-B中前一个NAL的DON值+1)%65535, %是取模运算。
6.2 多时刻聚合包(MTAPS)
      多时刻聚合包的NAL单元负载由16位的无符号解码顺序号基址(DONB)(网络字节序)以及一个或多个时刻聚合单元,如图9 表示。DONB 必须包含MTAP中NAL单元的第一个NAL的DON值。
   MTAPS-16 的格式如下:


MTAPS-24 的格式如下:

7.分片单元(FUS)
     本负载类型允许分片一个NAL单元到几个RTP 包中。分片只定义于单个NAL 单元不用于任何聚合包。NAL单元的一个分片由整数个连续NAL单元字节组成,每个NAL单元字节必须正好是该NAL 单元的一个分片的一部分。相同NAL单元的分片必须使用递增RTP序号连续顺序发送。NAL单元必须按照RTP 顺序号的顺序装配
     FU-A 的格式如下:

FU-B 的格式:FU-B由一个字节的分片单元指示,1个字节分片单元头,和解码顺序号(don)以及分片单元负载组成

FU 指示字节有以下格式:

FU 头的格式如下:

S:1 bit
     开始位,当设置成1,表示分片NAL单元的开始
E:1bit
     结束位,设置为1,表示分片NAL单元的结束


8.参考文章
https://segmentfault.com/a/1190000007246199
http://blog.csdn.net/a675311/article/details/52371150 h264 一帧,片,参数集,nalu 等概念
http://www.cnblogs.com/lidabo/p/4582040.html h264 元素分层结构
RFC3984


0 0
原创粉丝点击