H264的RTP封包

  • H264流结构

        H264的ES流的结构分为两层,包括视频编码层(VCL)和网络适配层(NAL)。视频编码层负责视频内容表示,而网络适配层负责对数据进行打包和传送。NAL和VCL分离主要有以下两方面的好处:
1、信号处理和网络传输分层,VCL和NAL可以在不同的处理平台上实现;
2、VCL和NAL分离设计,可以在不同的网络环境内,网关不需要因为网络环境不同而对VCL比特流进行重构和重编码。
        H264的ES流由一系列的NALU(Network Abstraction Layer Unit)组成,不同的NALU数据量各不相同。每个NALU前添加起始码:0x000001或0x00000001,用来指示一个NALU的起始和终止位置。在这样的机制下,解码器在码流中检测起始码,作为一个NALU的起始标识,当检测到下一个起始码时,当前NALU结束。每个NALU单元由一个字节的NALU头(NALU Header)和若干字节的载荷数据(RBSP)组成。其中NALU头的格式如图2所示:

01234567
FNRITYPE

F:forbidden_zero_bit  占1位,如果有语法冲突,则为1。当网络识别此单元存在比特错误时,可将其设为1,以便接收方丢掉该        单 元。
NRI:nal_ref_idc. 占2位,用来指示该NALU的重要性等级。值越大,表示当前NALU越重要。具体大于0时取何值,没有具体规定。
Type:占5位,指出NALU的类型,具体类型如下所示:

NALU类型
nal_unit_typeNALU内容C
0未指定
1非IDR图像的编码slice2,3,4
2编码slice数据划分A2
3编码slice数据划分B3
4编码slice数据划分C4
5IDR图像中的编码slice2,3
6SEI(补充增强信息)5
7SPS(序列参数集)0
8PPS(图像参数集)1
9接入单元定界符6
10序列结束7
11码流结束8
12填充数据9
13~23保留
24~31未指定

需要特别指出的是,NRI值为7和8的NALU分别为序列参数集(SPS)和图像参数集(PPS).

  • RTP简介

RTP全名是Real-time Transport Protocol(实时传输协议),配套的相关协议RTCP(Real-time Transport Control Protocol,即实时传输控制协议),实时流传输协议RTP详细说明了在互联网上传递音频和视频的标准数据包格式,它与RTCP协议配合使用,本篇只讲视频H264的rtp封包,RTP实现IP网络端到端实时的传输多媒体数据,并提供时间信息和流同步,具有低延时的特点。

  • RTP封包

  • RTP包头header

每一个RTP数据包都由固定的包头(header)和载荷(payload)两部分组成,其中包头前12字节的含义是固定的,而载荷则可以是音频或者视频数据。RTP的12字节固定包头格式如下:

01234567012345670123456701234567
VPXCCM载荷类型(PT)序号(sequence number)

                                                                                                时间戳(timestamp)

同步信源标识符(SSRC identifier)
特约信源标识符(CSRC identifiers)

各字段含义:
V:RTP协议版本号,占2位,一般协议版本号为2
P:填充标志,占1位,如果P = 1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分
X:扩展标志,占1位,如果X = 1, 则在RTP报头后跟有一个扩展报头
CC:CSC计数器,占4位,指示CSRC标识符的个数
M:占1位,标记解释由设置定义,目的在于允许重要事件在包流中标记出来,如不同的有效载荷有不同的含义,对于视频,标记         一 帧的结束;对于音频,标记会话的开始。
载荷类型(PT):占7位,用来指出RTP负载的具体格式。rfc里面对一些早期的格式定义了这个payload type,但是后来的h264并没                            有分配,现在用96代替,因此现在96以上都不表示特定个的格式,具体表示什么要用sdp或者其他协议来协商。
序列号(SN):占16位,用于标识发送者所发送的RTP报文的序列号,每发送一个报文,序列号增1 ,序列号的初始值是随机产生                        的,可以用于检查丢包以及进行数据包排序。
时间戳Timestamp:占32位,必须使用90KHz时钟频率
同步信源(SSRC)标识符:占32位,指RTP包流的来源。该标识符是随机产生的,
                                       参加同一视频会议的两个同步信源不能有相同的SSRC
特约信源(CSRC)标识符:占32位,可以有0~15个。每个CSRC标识了包含在该RTP报文有效载荷中的所有特约信源。

  • RTP负载payload

       RTP的负载payload的数据就是H264的NALU,对于每个NALU,根据其包含的数据量的不同,其大小也有差异。在IP网络中,当要传输的IP报文大小超过最大传输单元MTU(Maximum Transmission Unit)时就会产生IP分片情况。在以太网环境中可传输的最大IP报文(MTU)的大小为1500字节。如果发送的IP数据包大于MTU,数据包就会被拆开来传送。

       RTP负载的第一个字节的结构体如下,它和H264的NALU头结构一致,可以把它认为是RTP h264负载类型字节,完全是多增加的一个字节,不影响后面的NALU结构。

  • 图1  Fu Indicator
    ​​​​
  • 封包

单一NAL单元模式
对于NALU的长度小于MTU大小的包,一般采用单一NAL单元模式,对于一个原始的H264NALU单元常由“起始码”+“Nalu Header” + "Nalu Payload"三部分组成,其中起始码是一个Nalu的开始,必须是“00 00 00 01”或“00 00 01”,Nalu头仅为一个字节,其后都是Nalu单元内容,打包时把起始码去除掉,其他数据打包成payload即可。

例: 如有一个 H.264 的 NALU 是这样的:
[00 00 00 01 67 42 A0 1E 23 56 0E 2F ... ]
这是一个序列参数集 NAL 单元. [00 00 00 01] 是四个字节的开始码, 67 是 NALU 头, 42 开始的数据是 载荷数据内容.
封装成 RTP 包将如下:
[ RTP Header ] [ 67 42 A0 1E 23 56 0E 2F ]
即只要去掉 4 个字节的开始码就可以了.

FU-A打包方式
当NALU的长度超过MTU时,就必须对NALU单元进行分片封包,这里只讲一下FU-A的分片封包方式。FU-A的头部由两个字节组成,分别是Fu Indicator和Fu-A Header,再后面是负载。Fu Indicator见上图1,Fu Header如下

Fu Header
01234567
SERType


 

S:1位,Start位,当被设置为1时,表示NAL单元的开始。当后面的Fu载荷不是被分片Nal单元载荷的开始时,此位置0。
E:1位,End位,意义和Start位相反,当置1时,表示Nal单元的结束,当FU载荷不是Nal单元的最后一个分片时,此位置0。
R:1位,Reserved位,必须等于0,且接收者必须忽略它。
Type:5位,Nal单元荷载类型,定义见表《NALU类型》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值