h264 RTP头解析流程 结合NALDecoder.c分析

协议分析 :每一个RTP数据报都由头部(Header)和负载(Payload)两个部分组成,其中头部前 12 个字节的含义是固定的,而负载则可以是音频或者视频数据。

一个活动顺序参数集在一个编码视频序列中保持不变,一个活动图像参数集在一个编码图像里保持不变。

H.264编码器必须根据H.264规范设置NRI值(subclause 7.4.1)当nal_unit_type 范围的是1到12. 特别是,H.264规范, 要求对于nal_unit_type为6,9,10,11,12的NAL单元的NRI的值应该为0。

      对于nal_unit_type等于7,8 (指示顺序参数集或图像参数集)的NAL单元,H.264编码器应该设置NRI为11 (二进制格式)对于nal_unit_type等于5的主编码图像的编码片NAL单元(指示编码片属于一个IDR图像), H.264编码器应设置NRI为11。

打开H264文件,读取流

找到 NALU 标致startcode,即00 00 01 或 00 00 00 01 串

判断UALU单元数据段大小,(UDP一次能发送最大数据为64K字节)

使用何种发送方式(单一发送、聚合发送、分片发送)

如果UALU数据<1500(自己设定),使用单一包发送:

填充RTP头(12 BYTE),payload(7 bit):96 marker(1 bit):0 seq_no(16 bit):随机取 timestamp(32 bit):

第13字节填充NALU头(startcode 的下一个字节),

如果NALU数据>1500,使用分片发送:(分三种情况设备:第一次RTP,中间的RTP,最后一次RTP)

填充RTP头,类似单一包发送,发送整个NALU,timestamp只曾加一次。

不同的是,第13字节填FU INDICATOR,它的type要成28;第14字节才填FU HEADER,

  • 第一次RTP:第13 BYTE 是FU INDICATOR ,其中它的TYPE设置成 28 ;第14 BYTE 是 FU HEADER ,S:E:R = 1:0:0,之后才是视频数据。
  • 中间的RTP:第13 BYTE 是FU INDICATOR,其中它的TYPE设置成 28 ;第14 BYTE 是 FU HEADER ,S:E:R = 0:0:0,之后才是视频数据。
  • 最后一次RTP:第13 BYTE 是FU INDICATOR,其中它的TYPE设置成 28 ;第14 BYTE 是 FU HEADER ,S:E:R = 0:1:0,之后才是视频数据。

NALU数据很小时,用组合封装:

组合封装:NALU payload = NALU payload size + NALU payload header + NALU payload data

如有一个 H.264 的 NALU 是这样的:

[00 00 00 01 67 42 A0 1E 23 56 0E 2F ... ] [00 00 00 01 67 42 A0 1E 23 56 0E 2F ... ]

这是一个序列参数集 NAL 单元. [00 00 00 01] 是四个字节的开始码, 67 是 NALU 头, 42 开始的数据是 NALU 内容.

封装成 RTP 包可能如下:

[ RTP Header ] [78, STAP-A NAL HDR, 一个字节 ] [长度, 两个字节] [ 67 42 A0 1E 23 56 0E 2F ...] [长度, 两个字节] [ 67 42 A0 1E 23 56 0E 2F... ]


读rfc 3984搞混了的几个TYPE:

  • RTP 中的PT 负载类型 Payload type (PT) : 7 bits --发送H264视频,此值固定设成 96
  • NALU 中的TYPE 描述了NALU的属性,如:7指示顺序参数集,8指示图像参数集
  • RTP之后的TYPE,即13 BYTE开始,单一打包的TYPE,与NALU中的TYPE一样;FU 分片打包方式,TYPE设成28;

参考:

http://bbs.chinavideo.org/viewthread.php?tid=2451&highlight=rtp%2Bh264

http://www.cppblog.com/czanyou/archive/2010/02/09/67940.html#107573

H264 RTP头分析相关推荐

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

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

  2. h264 rtp FU-A

    总括: 一帧视频数据可以编码成多个H264的NALU, 每个NALU的开头为00 00 00 01: 一个RTP包可以传送 部分.一个或多个 NALU,看NALU的大小而定. 之前写过一篇文章,分析了 ...

  3. tcp码流中查找rtp头_跟踪数据流中的时间以查找性能问题

    tcp码流中查找rtp头 We're facing a challenge with several of our data flows that use more time than they ha ...

  4. PE文件学习系列二 DOS头分析

    合肥程序员群:49313181.    合肥实名程序员群 :128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:egojit@qq.com PE文件 ...

  5. 【sfu】开启 rtp头扩展的extmap-allow-mixed模式

    extmap-allow-mixed extmap-allow-mixed 是sdp中的一个选项 关键是要让rtcprtp模块能支持rtp 封包拆包,特别是封包的时候能mixed 这样子,大小大于16 ...

  6. 如何去掉RTP头或RTP拓展头

    当我们接收RTP承载的音视频数据,并且使用一些开源的播放库时,都需要先将RTP的头去掉,若RTP头是没有带拓展数据的,那去掉相对应的12个byte就可以,但是当带有RTP拓展头时就比较麻烦. 一.RT ...

  7. 用实例分析H264 RTP payload

    From: http://blog.csdn.net/zblue78/article/details/5948538 H264的RTP中有三种不同的基本负载(Single NAL,Non-interl ...

  8. 一段H264数据的分析

             目录(?)[-] 分析00 00 00 01 67 42 00 1E 99 A0 B1 31 00 00 00 01 分析00 00 00 01 68 CE 38 80 00 0 ...

  9. H264帧的分析sps pps

    帧格式 H264帧由NALU头和NALU主体组成. NALU头由一个字节组成,它的语法如下: +---------------+       |0|1|2|3|4|5|6|7|       +-+-+ ...

最新文章

  1. 尚未备份数据库 *** 的日志尾部。如果该日志包含您不希望丢失的工作,请使用 BACKUP LOG WITH NORECOVERY 备份该日志。...
  2. android标题栏(titlebar)显示进度条
  3. aapt: error while loading shared libraries: libstdc++.so.6: wrong ELF class: ELFCLASS64
  4. BI国产化替代进入实质阶段,新产品新方案提高加速度
  5. TCP的三次握手与四次挥手图文
  6. Strom+Kafka + redis实时计算单词出现频率的案例
  7. 怎样分辨谁才是朋友圈里的真·贵族?
  8. php7 ast,PHP7 的抽象语法树(AST)带来的变化
  9. 初识Firebug 全文 — firebug的使用
  10. spss分析qpcr数据_谁说菜鸟不会数据分析--SPSS篇
  11. 1.2顺序线性表的归并
  12. React行内样式写法
  13. Java POI 合并单元格操作以及代码示例
  14. 华为云git clone代码
  15. BootStrap--CSS组件--按钮组(btn-group)
  16. wetool企业微信营销管理系统开发
  17. js:使用nodejs为页面传递mysql中的数据
  18. linux 内核usleep,Linux的sleep()和usleep()的使用和区别
  19. 2014第二十二届全国青少年信息学奥林匹克联赛初赛
  20. iPhone开发播放音乐与按钮声音

热门文章

  1. ASP.NET Core管道深度剖析(4):管道是如何建立起来的?
  2. [你必须知道的.NET] 第二回:对抽象编程:接口和抽象类
  3. Python3 爬虫学习笔记 C09【数据储存系列 — 文件储存】
  4. Python 中 if __name__ == '__main__': 的理解
  5. 【Python学习】 - 超详细的零基础Pandas学习(附Python数据分析与应用课本第四章实训答案)
  6. C++自定义迭代器模板,实现ArrayList基本操作,自定义迭代器遍历
  7. C 的Pair用法分类整理(精)
  8. Java基础部分快速复习(以前复习的时候放在自己的新浪博客上)
  9. 基于android公交车线路查询论文文献,本科毕业论文---基于android的手机公交线路查询系统.doc...
  10. oracle开放视图,Oracle视图