如何实现H.264的实时传输?
#01
基本格式
01
H.264的RTP报头
图1 RTP报头
02
H.264的RTP负载类型
H.264的RTP负载可分为三大类,类型如下:
此类RTP负载中仅包含单个NAL单元。负载报头类型编号等于原始NAL单元类型,即从 1 到 23 的范围值,详见H.264规范。
此类型用于聚合多个NAL单元成为单个 RTP 负载。这类数据包有四个细分版本:单时间聚合包A (STAP-A)、单时间聚合包B (STAP-B)、16位偏移多时间聚合包 (MTAP16) 和24位偏移多时间聚合包 (MTAP24)。负载类型编号分配给 STAP-A、STAP-B、MTAP16 和 MTAP24 的值分别为 24、25、26 和27。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
03
H.264的RTP打包模式
单NAL单元模式
所有的接收端都必须支持这种模式,主要应用于兼容低时延应用中的硬件设备。只有单NAL单元数据包可以在这种模式下使用。
非交错模式
建议接收端去支持这种模式,主要应用于低时延应用。只有单NAL单元、STAP-A和FU-A数据包可以在这种模式下使用。
交错模式
有需求的接收端可以去支持这种模式,主要应用于非低延时应用。STAP-B、两种MTAP、FU-A和FU-B数据包可以在这种模式下使用。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
单NAL单元和非交错模式中,NAL单元必须以NAL单元解码顺序传输,这两种模式更适合低延时需求的交互系统。
交错模式中NAL单元的传输顺序和解码顺序可以是不一致的,导致接收端的解包过程中需要按照解码顺序重新排序,引入更多的时延,因此并不适合需要低时延的交互系统。
04
H.264的RTP负载报头
H.264的RTP负载报头位于负载的第1个字节,分成三个字段:
05
H.264的RTP负载格式
因为只有单NAL单元模式和非交错模式打包模式更适合应用于低时延交互系统中,而这两种打包模式所涉及的只有单NAL数据包、单时间聚合包A(STAP-A)和分片单元A(FU-A)三种RTP负载,所以在这里只对这三种负载格式做个简单的介绍。
单NAL数据包就是将原始的NAL单元直接放置到RTP的负载中,NAL单元头就是作为单NAL数据包的负载类型。
单时间聚合包A(STAP-A)
聚合数据包的负载中包含一个或者多个聚合单元。一个聚合包可以携带尽可能多的聚合单元;不过聚合数据包中的总数据量应该选择合适大小,以便生成的IP数据包小于MTU大小。聚合数据包负载报头中的NRI字段的值必须是所有聚合NAL单元中最大值。
#02
实践分享

图9 视频流工作流程
01
H.264打包
H.264的打包的基本流程大致如下:
-
输入H.264 NAL,判决当前的H.264 NAL的打包格式,可以选择单NAL单元包格式、STAP-A包格式,或者是FU-A格式。MTAP格式一般不在实时系统中使用,考量的重点在于兼顾打包效率和传输效率。 -
Single-NAL-Unit 打包比较简单,一个NAL封装为一个RTP包。 -
STAP-A在NAL包比较小的时候采用,多个相同时间戳的NAL包被打到一个RTP包。 FU在NAL包比较大的时候采用,限制RTP包的大小小于MTU。一个NAL包被拆成多个碎片(Fragment), 碎片被打成RTP包。
02
H.264解包
在此只对三种打包模式下的解包过程做一个大致的介绍。
参考文献
2、RFC 6184 – RTP Payload Format for H.264 Video
本文分享自微信公众号 - 音视频开发进阶(glumes_blog)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
- 音视频进阶教程-实现直播间的自定义视频渲染
- 音视频开发进阶|第六讲:色彩和色彩空间·上篇
- H264 视频文件如何缩放分辨率?
- 星球专享 | 播放器 FFmpeg 依赖库的配置
- 干货收藏 || Vulkan Game Engine 视频教程
- HDR技术趋势浅析
- WebRTC 实现 Android 传屏 demo
- 技术群里如何提问才能获得更高的回复率呢?
- 【建议收藏】30 分钟入门 Vulkan (中文翻译版)
- 浅谈音视频自动化测试
- 揭秘版权保护下的视频隐形水印算法(下篇)
- 如何用研发效能搞垮一个团队
- 如何实现H.264的实时传输?
- 短视频中解决音视频混音出现杂音的问题
- 字节跳动招聘:30-60k 不限工作经验!什么岗位这么香?
- 进击的斜杠程序员 | 音视频技术内容变现
- 面试官:RecyclerView布局动画原理了解吗?
- 音视频开发进阶-学习笔记3-使用LAME编码mp3文件
- 音视频开发进阶-学习笔记2-LAME交叉编译
- 互联网寒冬之下,Android开发的港湾:音视频进阶学习