h265、h264的RTP包封装区别

一、NAL单元

1、h264 NAL单元

    /**     h264 nal头部(1字节)*    0 1 2 3 4 5 6 7*   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*   |F|NRI|  Type   |  NAL payload ……*   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
    名称       bit   备注 禁止位      1    为0的时候合法优先级      2    数值越大优先级越高,表示越重要   NAL类型     5    一共有32种(sps是7, pps是8, sei是6. I帧是5 P帧是1)

2、h265 NAL单元

/**         h265 nal头部(2字节)*    0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7*   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *   |F|   Type    |  layerID  | TID |  NAL payload ……*   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
名称       bit   备注
禁止位      1    为0的时候合法
NAL类型     6    一共有64种 一半为视频数据类型 一半为非视频数据类型 (vps是32, sps是33, pps是34, 前缀sei是39. IDR是19或20 后置图像帧是1)
视频层ID    6    目前设为0,以后扩展
TID        3    目前通常设为1,nuh_temporal_id_plus1.

可以看出来265的nal头部要比264多出了1字节(为了以后扩展多视点、立体视频源),封装rtp包时要注意相应数据的提取。

265的NAL类型也比264的多了一倍,主要区别是比264新增了vps(视频参数集),完整I帧的内容为vps+sps+pps+sei+I帧。

二、rtp包封装

1、小包封装(如sps、pps、sei等)

这些长度较短(小于1400字节)的NAL单元数据,只要在读取完该单元后,去掉起始码(0x 00 00 01或0x 00 00 00 01),就可以直接作为rtp负载内容加载到rtp头部后发送出去了(这里关于rtp头部内容就不说了,对于264和265 rtp头部的内容设置方法一样)。需要注意的地方是该rtp包的时间戳一定要设置,如h264的I帧前的sps、pps、sei,这三个的时间戳应该一致,而且和I帧的时间戳一致(本来编码的时候就是一起生成的)。

/*    RTP包的封装格式*    RTP包头部最短为12字节(不用设置CSRC,即CC=0的时候)*    0                   1                   2                   3*    7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0*   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*   |V=2|P|X|  CC   |M|     PT      |       sequence number         |*   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*   |                           timestamp                           |*   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*   |           synchronization source (SSRC) identifier            |*   +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+*   |            contributing source (CSRC) identifiers             |*   :                             ....                              :*   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*   |                          rtp负载内容                           |*   :                             ....                              :*   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/

2、分包封装(如I帧等)

通常的I帧和P帧数据都是比较大的(比1400字节要大得多),这时候就需要分包处理,因为经过udp或tcp打包后,过长的数据(超过1500字节)到了ip数据报打包的时候会被分包,到了接收端会产生粘包等问题。
这里介绍一般常用的 FU-分片包

①264的分片包

 /*  264的分片包和小包封装的差别是 原先的NAL头(1字节) 变为了现在的FU indicator+FU header(共2字节)*  0               1               2*  0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* | FU indicator  |   FU header   |   FU payload   ...  |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
 /**     FU Indicator*    0 1 2 3 4 5 6 7*   +-+-+-+-+-+-+-+-+*   |F|NRI|  Type   |  这里的Type变为分片类型(28)*   +-+-+-+-+-+-+-+-+*/  /**      FU Header*    0 1 2 3 4 5 6 7*   +-+-+-+-+-+-+-+-+*   |S|E|R|  Type   |  原先NAL头部的类型保存在这里的Type*   +-+-+-+-+-+-+-+-+*/

FU Indicator其实和NAL头部几乎一样,就是nal类型变成了分片包的类型28,原先的nal类型保存到了FU Header中的Type。
FU Header中:
S(start) 为1时表示分片包的第一包
E( end) 为1时表示分片包的最后一包
R 这个值一直为0(保留)
因此可以知道,不是第一包或最后一包的时候 S、E都设为0。
FU payload就是原先nal数据的一部分(分片)数据了。
这些数据都填充好后就可以放到rtp包的负载内容发送了。

②265的分片包

/*  h265的分片包,大致和264的一样,总的头部变为了3字节*  0                   1                   2*  0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* |          FU indicator          |   FU header   |   FU payload   ...  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
/**     FU Indicator*    0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7*   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    *   |F|   Type    |  layerID  | TID | 这里的Type=49(分片包类型)*   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*//**      FU Header*    0 1 2 3 4 5 6 7*   +-+-+-+-+-+-+-+-+*   |S|E|    Type   | 原先的NAL类型同样保存在了这里*   +-+-+-+-+-+-+-+-+*/

FU Indicator的填充大致和上面264的一样,修改的只是类型,而原先264中FU Header中的R被删掉了,S、E用法不变,这里的Type(6字节)也是填写该NAL单元原本的类型。

③小要点

每个RTP分片包的时间戳设置要注意,同一帧NAL单元的各个分片包时间戳应设为一致。
在264流中经常出现的是 I帧(类型5)、P帧(类型1)、B帧(较少接触),而在265流中目前接触到的是 I帧(类型19或20)、非I帧【包括前置图像帧(类型0),后置图像帧(类型1)】

三、RTSP传输时SDP内容差异

1、rtsp传输 h264 最简易的sdp内容(DESCRIBE请求回复)

v=0
o=- 91575441432 1 IN IP4 192.168.1.241
t=0 0
a=control:*
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=control:track0

2、rtsp传输 h265 最简易的sdp内容(DESCRIBE请求回复)

v=0
o=- 91575441714 1 IN IP4 192.168.1.241
t=0 0
a=control:*
m=video 0 RTP/AVP 96
a=rtpmap:96 H265/90000
a=control:track0

可以看出来sdp信息基本一致,变化的只是H264->H265(个人认为96是对应h264的,但是不修改同样可以推拉流h265,可在vlc播放)

其他的流程步骤基本和h264的一样。

下面放一张h265的rtsp推流抓包图,一开始的发送顺序是 vps、sps、pps、sei、I帧各分片、非I帧各分片,依次循环。

想了解更多RTSP相关知识可以参考该系列(入门级):
https://blog.csdn.net/weixin_42462202/article/details/98986535

h265、h264的RTP包封装区别相关推荐

  1. H265打包成RTP包详解

    在我们的高清视频传输中,一般都需要对视频信息进行指定协议的打包,RTP是比较常用的一种视频打包负载传输方式,那么具体是怎么打包的呢?今天就简单介绍一下. 1.H265的结构 在H265中,每一个前缀码 ...

  2. wireshark提取视频数据之RTP包中提取H264和H265

    wireshark提取视频数据之RTP包中提取H264和H265 文章目录 wireshark提取视频数据之RTP包中提取H264和H265 1 背景 2 提取前工作 3 H264视频从RTP包中提取 ...

  3. H264关于RTP协议的实现

    完整的C/S架构的基于RTP/RTCP的H.264视频传输方案.此方案中,在服务器端和客户端分别进行了功能模块设计.服务器端:RTP封装模块主要是对H.264码流进行打包封装:RTCP分析模块负责产牛 ...

  4. RTP协议封装H264/H265/AAC

    <RTSP实时音视频传输介绍> 目录 一.前言 二.RTP基本格式介绍 1.RTP 固定头 2.RTP 扩展头 3.RTP 载荷 三.RTP封装H264 1.封装包类型 四.RTP封装H2 ...

  5. RTP 上封装H264 数据包

    原文链接:https://www.cnblogs.com/Jade2009/p/5654650.html 1.  引言         随着信息产业的发展,人们对信息资源的要求已经逐渐由文字和图片过渡 ...

  6. RTP协议解析及H264/H265 音视频RTP打包分析

    一 概述 实时传输协议(Real-time Transport Protocol或简写RTP)是一个网络传输协议,它是由IETF的多媒体传输工作小组1996年在RFC 1889中公布的. RTP协议详 ...

  7. 将H264码流打包成RTP包

    分类: 流媒体(25) 版权声明:本文为博主原创文章,未经博主允许不得转载. H264码流打包成RTP包的代码如下: [cpp] view plaincopy #include <stdio.h ...

  8. H264码流打包成RTP包

    http://blog.csdn.net/tanningzhong/article/details/53281986 H264码流打包成RTP包的代码如下: [cpp] view plaincopy ...

  9. H265码流RTP封装方式详解

    文章目录 H265码流RTP封装方式详解 1 H265编码方式介绍 2 H265码流RTP封装方式 2.1 单一帧封装模式 2.2 组合帧封装方式 2.3 分片封装模式 2.4 代码片段解析 H265 ...

最新文章

  1. 项目启动时socket自动启动_spring boot 项目在启动时调用接口
  2. 交换机用python定时备份
  3. 基于ZYNQ的机器视觉应用实例
  4. multiprocessing python_Python教程:进程和线程amp;多进程
  5. Haproxy 让后端RS记录真实IP
  6. Android编程权威指南学习:Activity之间传递参数
  7. 面试题--------9、mysql的drop delete truncate 分别在什么场景下使用
  8. ArcMAP 用不同颜色区分地类
  9. u盘安装ubuntu server 14.04 以及No CD-ROM drive was detected 错误
  10. 5000并发的qps是多少_高并发和高性能系统中进程、线程、协程、队列(如何调度的)...
  11. Devcpp(Dev-C++)代码编辑的快捷键
  12. 使用Scikit Learn的分类器探索Iris数据集
  13. 课程设计题七:交通灯控制器
  14. 世人皆苦,唯有自渡的句子,句句触动灵魂!
  15. RabbitMQ中的cluster、mirrored queue,以及 warrens机制、RAM node、disk node及vhost介绍
  16. 布法罗计算机专业怎么样,2019上海软科世界一流学科排名计算机科学与工程专业排名纽约州立大学布法罗分校排名第76-100...
  17. 犹太裔大陆籍华人的故事-值得一读
  18. 将英文输入变成手写体的在线工具
  19. 利用矩阵键盘制作密码锁
  20. 好橱柜彰显好品味,太子家居橱柜定制凸显家的气质

热门文章

  1. day02---python爬虫学习笔记---------------化妆品生产许可证关系系统服务平台
  2. 嵌入式linux之go语言开发(六)几行代码实现终端的远程日志诊断
  3. 银行、证券行业云计算身份识别服务器深度开发
  4. Materialize——扁平化卡片式网页模板
  5. 1200w流量增长,精准拿捏B站涨粉又热门的爆款秘籍!
  6. mysql 向上递归查询_mysql如何实现递归查询
  7. (转)AS3-元数据Embed嵌入说明
  8. 2020年中国大学排名出炉!你报考的大学排第几?(软科)
  9. Java项目:汽车出租租赁系统(java+jsp+SSM+maven+mysql)
  10. python 分析图片获取拍摄时间和拍摄地点