多媒体实时通信(如语音或视频通话)一般会使用RTP/UDP进行传输,本文对H264视频在RTP传输的数据格式进行总结,RFC6184 《RTP Payload Format for H.264 Video》是H264 over RTP的规范文档,详细的内容和细节请参考该规范;本文满足RFC6184,且只是其内容的一部分,但这部分对于视频通话来说已经足够了,我曾经所负责的一个实时视频通话项目就是这样实现的。


  • 打包流程

1)从H264编码器读出一帧数据(一个完整的H264帧)

2)然后遍历H264的所有NALU; H264帧数据结构见下章节

2.1)如果NALU长度小于MTU,则将该NALU打包为一个RTP包

2.2)否则,将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帧的。

Payload Type Packet Type
0 reserved
1-23 NALU unit
24 STAP-A
25 STAP-B
26 MTAP16
27 MTAP24
28 FU-A
29 FU-B
30-31 reserved

  • 代码

以后有时间了再整理出来。

H264 over RTP 的打包相关推荐

  1. H264视频传输、编解码----RTP协议对H264数据帧拆包、打包、解包过程

    H264帧需要通过RTP协议进行传输,这其中就涉及到H264数据帧的封包.拆包和解包等过程. RTP协议格式 下面是 RFC 3550 中规定的 RTP 头的结构: 0 1 2 3 40 1 2 3 ...

  2. 音视频协议-RTP协议打包

    目录 H264打包RTP的方法 RTP打包AAC 1. H264打包RTP的方法 RTP的特点不仅仅支持承载在UDP上,这样利于低延迟音视频数据的传输,另外一个特点是它允许通过其它协议接收端和发送端协 ...

  3. h265、h264的RTP包封装区别

    h265.h264的RTP包封装区别 一.NAL单元 1.h264 NAL单元 /** h264 nal头部(1字节)* 0 1 2 3 4 5 6 7* +-+-+-+-+-+-+-+-+-+-+- ...

  4. 关于RTP时间戳及多媒体通信同步的问题/H264关于RTP协议的实现

    http://www.rosoo.net/a/201101/10776.html http://hi.baidu.com/fairygardenjoy/blog/item/e56c5cca95829e ...

  5. 关于H264通过RTP传输的打包方式

    Q:现在小弟初次尝试H264的编码通过RTP方式传输,具体实验环境的问题如下: 环境: 服务器端,H264的帧数据(可能超过64k),分成N个1460字节的包,然后加上RTP头发送. 客户端,VLC播 ...

  6. 按照RFC3984协议实现H264视频RTP打包(附源代码)

    2011-03-30 10:34:44|  分类: 流媒体 |  标签: |字号大中小 订阅 参考链接:http://topic.csdn.net/u/20090725/11/5FBC75B0-109 ...

  7. H264关于RTP协议的实现

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

  8. 利用ffmpeg进行摄像头提取视频编码为h264通过RTP发送数据到指定的rtp地址

    话不多说命令如下: ffmpeg -f dshow -i video="Logitech QuickCam Easy/Cool" -vcodec libx264 -preset:v ...

  9. H264 over RTP中存在多个SPS、PPS、[SEI]、 IDR序列是否都需要

    这一段从三光吊舱接收数据时,因为对方外协了一个转换盒子,将同步422出来的h264编码的数据转成了RTP进行发送.我们能拿到的就是这个RTP数据.使用wireshark抓了一堆包,然后使用rtp_h2 ...

最新文章

  1. activity使用dialog主题
  2. Strusts2 高危漏洞又来了,老项目自查起来!
  3. redis(22)--二进制位数组
  4. mysql边备份边导入么_MySQL 怎么导入导出操作
  5. mysql 8.0配置主从同步_MySQL 8.0 主从同步
  6. dropdownList级联刷新gridView
  7. JSTARS投稿学习笔记
  8. 控制上网!!!(版本之1.0)
  9. 在MySQL中删除重复的行
  10. tricks about and-or in python
  11. Hyperledger Fabric 或 Composer 获取某个channel区块链的信息 或 区块链的最新高度
  12. java book_java_book java 图书管理系统 GUI - 下载 - 搜珍网
  13. 网上下载的php源码怎么运行,在中国站长站下载的asp源码,如何在自己电脑上运行?...
  14. 2020最新的eclipse之安卓开发环境搭建
  15. 【电脑视频录制软件】各种录屏软件优缺点,OBS的格式转化,清晰度调节,基本使用,下载链接
  16. a标签去掉下划线,html,超链接去掉下划线
  17. 一份无锡工程师的分享
  18. C++:tuple的解包tie【tuple<std::string, int, int> tp;tie(name, ages, areaCode) = tp】
  19. HDU-6638 Snowy Smile 区间最大子段和
  20. 学习笔记:Qt程序打包发布

热门文章

  1. 计算机中丢失xapofx1 5.dll,xapofx1_5.dll丢失怎么办
  2. Java拖拽排序工具类
  3. 宝塔监控必应API定时进行站点地图提交php教程
  4. 商贸misc部分简单题目思路
  5. 树莓派Odroid等卡片式电脑上搭建NAS教程系列3-挂载HDD硬盘+节电设置
  6. Oracle 中的Top写法
  7. 免费ftp服务器FileZilla Server配置
  8. [数据分析方法论]剖析大数据分析方法论的几种理论模型
  9. matlab filter 函数,C++ 实现matlab filter()函数
  10. 【正点原子Linux连载】第十四章 Qt控制LED 摘自【正点原子】I.MX6U嵌入式Qt开发指南V1.0.2