H.264 裸数据打包 RTP 方法
2019/6/27 田野
问题背景:
在从海康开始接触流媒体相关项目后,陆陆续续也完成了很多关于音视频的处理。其中在处
理过程中主要是传输这块,经常会看到把 H264 的裸码流通过 RTP 协议传输到客户端,客户
端进行解码播放。RTP 可以承载在 TCP、UDP、甚至 RTSP 上(利用交错方式)。那么这里面
就涉及到如何将 H264 码流打包 RTP,这里有专门的 RFC 文档进行了规定。但实际中我们会
看到都采用的单包和 FU-A 这两种方式结合,其它方法很少遇到。
当然除了将 H264 打包成 RTP 包,也可以打包成 PS、TS、FLV、MP4 等格式。打包成这种封
装格式后,我们再通过 RTP 协议、HTTP 协议、RTMP 等进行传输。
注意的是,我们现在讨论的都是将编码后的数据 NALU 如何进行封装,传输的问题,这里不
涉及编码和解码环节。
背景知识:
既然是讨论 H264 打包 RTP,那么我们需要补充 RTP 协议,H264 的基本流结构,然后再讨论
打包方式。
RTP 协议和关键参数设置:
RTP 协议(RFC3550)是 IETF 在 1996 年提出适合实时数据传输的新型协议,同时和它配套
的协议还有 RTCP 协议即实时传输控制协议。因为 RTP 协议只是介绍了如何进行码流传输和
打包,但是没有讲解如何进行码流的控制,包括拥塞控制和流控制等信息,这个任务由 RTCP
来完成。
RTP 的协议头格式:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
|V=2|P|X| CC |M| PT | sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
| timestamp |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| synchronization source (SSRC) identifier |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
| contributing source (CSRC) identifiers |
| .... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
V:RTP 协议的版本号,占 2 位,当前协议版本号为 2
P:填充标志,占 1 位,如果 P=1,则在该报文的尾部填充一个或多个额外的八位组,它们
不是有效载荷的一部分,一般打包 0 即可。
X:扩展标志,占 1 位,如果 X=1,则在 RTP 报头后跟有一个扩展报头,也是默认 0
CC:CSRC 计数器,占 4 位,指示 CSRC 标识符的个数
M: 标记,占 1 位,不同的有效载荷有不同的含义,对于视频,标记一帧的结束;对于音频,
标记会话的开始。
评论0