H264 RTP头分析
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头分析相关推荐
- RTP协议解析及H264/H265 音视频RTP打包分析
一 概述 实时传输协议(Real-time Transport Protocol或简写RTP)是一个网络传输协议,它是由IETF的多媒体传输工作小组1996年在RFC 1889中公布的. RTP协议详 ...
- h264 rtp FU-A
总括: 一帧视频数据可以编码成多个H264的NALU, 每个NALU的开头为00 00 00 01: 一个RTP包可以传送 部分.一个或多个 NALU,看NALU的大小而定. 之前写过一篇文章,分析了 ...
- tcp码流中查找rtp头_跟踪数据流中的时间以查找性能问题
tcp码流中查找rtp头 We're facing a challenge with several of our data flows that use more time than they ha ...
- PE文件学习系列二 DOS头分析
合肥程序员群:49313181. 合肥实名程序员群 :128131462 (不愿透露姓名和信息者勿加入) Q Q:408365330 E-Mail:egojit@qq.com PE文件 ...
- 【sfu】开启 rtp头扩展的extmap-allow-mixed模式
extmap-allow-mixed extmap-allow-mixed 是sdp中的一个选项 关键是要让rtcprtp模块能支持rtp 封包拆包,特别是封包的时候能mixed 这样子,大小大于16 ...
- 如何去掉RTP头或RTP拓展头
当我们接收RTP承载的音视频数据,并且使用一些开源的播放库时,都需要先将RTP的头去掉,若RTP头是没有带拓展数据的,那去掉相对应的12个byte就可以,但是当带有RTP拓展头时就比较麻烦. 一.RT ...
- 用实例分析H264 RTP payload
From: http://blog.csdn.net/zblue78/article/details/5948538 H264的RTP中有三种不同的基本负载(Single NAL,Non-interl ...
- 一段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 ...
- H264帧的分析sps pps
帧格式 H264帧由NALU头和NALU主体组成. NALU头由一个字节组成,它的语法如下: +---------------+ |0|1|2|3|4|5|6|7| +-+-+ ...
最新文章
- 尚未备份数据库 *** 的日志尾部。如果该日志包含您不希望丢失的工作,请使用 BACKUP LOG WITH NORECOVERY 备份该日志。...
- android标题栏(titlebar)显示进度条
- aapt: error while loading shared libraries: libstdc++.so.6: wrong ELF class: ELFCLASS64
- BI国产化替代进入实质阶段,新产品新方案提高加速度
- TCP的三次握手与四次挥手图文
- Strom+Kafka + redis实时计算单词出现频率的案例
- 怎样分辨谁才是朋友圈里的真·贵族?
- php7 ast,PHP7 的抽象语法树(AST)带来的变化
- 初识Firebug 全文 — firebug的使用
- spss分析qpcr数据_谁说菜鸟不会数据分析--SPSS篇
- 1.2顺序线性表的归并
- React行内样式写法
- Java POI 合并单元格操作以及代码示例
- 华为云git clone代码
- BootStrap--CSS组件--按钮组(btn-group)
- wetool企业微信营销管理系统开发
- js:使用nodejs为页面传递mysql中的数据
- linux 内核usleep,Linux的sleep()和usleep()的使用和区别
- 2014第二十二届全国青少年信息学奥林匹克联赛初赛
- iPhone开发播放音乐与按钮声音
热门文章
- ASP.NET Core管道深度剖析(4):管道是如何建立起来的?
- [你必须知道的.NET] 第二回:对抽象编程:接口和抽象类
- Python3 爬虫学习笔记 C09【数据储存系列 — 文件储存】
- Python 中 if __name__ == '__main__': 的理解
- 【Python学习】 - 超详细的零基础Pandas学习(附Python数据分析与应用课本第四章实训答案)
- C++自定义迭代器模板,实现ArrayList基本操作,自定义迭代器遍历
- C 的Pair用法分类整理(精)
- Java基础部分快速复习(以前复习的时候放在自己的新浪博客上)
- 基于android公交车线路查询论文文献,本科毕业论文---基于android的手机公交线路查询系统.doc...
- oracle开放视图,Oracle视图