H264 over RTP 的打包!

一、打包流程:

图片
  • 从H264编码器读出一帧数据(一个完整的H264帧)
  • 然后遍历H264的所有NALU:如果NALU长度小于MTU,则将该NALU打包为一个RTP包;否则,将NALU按照MTU大小进行分片(本文只用FU-A分片格式)。

二、H264帧结构:

图片
图片

H264帧由多个NALU组成和起始码(start code),NALU之间有一个称为“起始码”字段分开,就是上图所示的黑色部分,起始码有两种格式:0x000001和0x00000001;有了起始码,我们就可以将H264帧里面的每个NALU取出来进行处理了。细心的读者们可能会有一个疑惑,如果NALU这个数据里面也包含有0x000001或0x00000001那就有问题了,是的!你能想到的问题,H264的专家也会想到的,H264规范里面对这个有特殊处理的,会进行相应的转码,确保NALU里面内容是不会出现0x000001和0x00000001的。

一个NALU由Header和RBSP两部分构成。

三、NALU打包到RTP:

图片
图片

上图展示了如何将一个NALU打包到RTP的payload;上图的左边的打包流程对应的场景是“NALU的长度 <= MTU”,直接将NALU的header拷贝到H264 RTP Payload Header上,将NALU的RBSP拷贝到H264 RTP Payload Content上。

上图右边的打包流程对应的场景是“NALU的长度 > MTU”,要将NALU的RBSP进行分片,以保证打包后的RTP报文长度不大于MTU,H264 RTP Payload Header由FU-identity + FU Header组成;FU-identity字段和NALU header字段的格式一样(如果不一样的话,接收端就搞不清这是一个NALU分片还是一整个NALU了),其最低的5bits表示payload的类型(不同的取值表示RTP的类型不同,见下表);FU payload就是NALU的RBSP(一部分);另外,属于同一H264帧的所有RTP头的时间戳都要打成相同的,接收端根据时间戳来判断哪些包是属于同一个H264帧的。

图片

文章参考:https://blog.csdn.net/u010178611/article/details/82592393

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论