RTMP

一、总体介绍

RTMP(Real Time Messaging Protocol)实时消息传送协议是 Adobe 公司为 Flash 播放器和服务器之间音频、视频和数据传输开发的开放协议。RTMP 协议工作在 TCP 之上,默认使用 1935 端口。

工作原理:RTMP 的 message 会切分为 n 个 chunk,再通过 TCP 协议传输。

为什么 rtmp 基于 tcp 协议,tcp 协议已经有化整为零的方式, rtmp 还需要将 message 划分更小的单元 chunk 呢?

分析原因:

1. tcp 协议划分一个个 tcp 报文,是为了在网络传输层上保障数据连续性,丢包重发等特性。

2. rtmp 划分 chunk 消息块,是为了在网络应用层上实现低延迟的特性,防止大的数据块(如视频数据)阻塞小的数据块(如音频数据或控制信息)。

二、结构组成

1. Message 结构

RTMP 协议消息头(RTMP Message Header)结构如下图所示:

参数分析:

Message Type(1 byte),消息类型,这个参数很重要,当写程序的时候需要根据不同的消息,做不同的处理。

Payload length(3 bytes),表示负载的长度(big-endian 格式)。

Timestamp (4 bytes),时间戳(big-endian 格式),超过最大值后会翻转。

Stream ID (3 bytes) ,消息流 ID(big-endian 格式),用于区分不同流的消息。

Message Payload,真实的数据。

2. Chunk 结构

RTMP 收发的数据称为 Message,所谓 Message 不外乎音视频数据和信令,而真正收发数据时把 Message 拆分为 Chunk 发送,每个 Chunk 的默认大小是 128 字节,当然这个大小可以通过控制信息来修改。Chunk 由 Chunk Header 和 Chuk Data 组成。

2.1 Chunk header:

RTMP 块头(RTMP Chunk Header)结构如下图所示:

2.2 Basic header:

RTMP 块基础头(RTMP Chunk Basic Header),一般是一个字节大小,结构大小如下图所示:

RTMP Chunk 包一般是由一个固定长度的包头和一个最长为 chunk default size 字节的包体(默认 128 字节)组成,包头可以是下面 4 种长度的任意一种:12, 8, 4, or 1 byte(s)。

rtmp相关视频讲解以及文档提取:https://docs.qq.com/doc/DWHhNTlVtaFJId0ht

第一个字节的前两个 Bit 很重要,它决定了包头的长度,它可以用掩码 0xC0 进行"与"计算。

format=0,Chunk Header length = 12 bytes,在一个 chunk 流的开始、时间戳返回的时候必须有这种块,比如:onMetaData, 音视频流刚开始的绝对时间戳,控制消息。

此时,基础头和块消息头(Basic header + Chunk Msg Header)结构如下图所示:

format=1,Chunk Header length = 8 bytes,对于可变大小消息的 chunk 流,在第一个消息之后的每个消息的第一个块应该使用这个格式。

此时,基础头和块消息头(Basic header + Chunk Msg Header)结构如下图所示:

format=2,Chunk Header length = 4 bytes,对于固定大小消息的 chunk 流,在第一个消息之后的每个消息的第一个块应该使用这个格式。

此时,基础头和块消息头(Basic header + Chunk Msg Header)结构如下图所示:

format=3,Chunk Header length = 1 bytes,当一个消息被分成多个块,除了第一块以外,所有的块都应使用这种类型。

此时,基础头和块消息头(Basic header + Chunk Msg Header)结构如下图所示:

注意事项:

关注+私信我,领取2022最新最全学习提升资料包,内容包括(C/C++,Linux,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)

​​​​​​​

1)timestamp 的长度为 3 bytes,当 timestamp 被设置为 0x00ffffff,chunk header 会加上 Extended Time Stamp 字段,否则 Extended Time Stamp 不会出现。

2)多个 Chunk 怎么标记同属于一个 Message 的呢?

其一、是通过 Chunk Stream ID 区分的,同一个 Chunk Stream ID 属于同一个 Message。

其二、因为 TCP 的有序,同一个 Message 中不同的 Chunk 会先后抵达。

以 FLV AAC 为例,协议层结构如下图所示:

FLV 音频标识头(FLV AudioTagHeader)结构如下图所示:

视频 Chunk

以 FLV AVC 为例,协议层结构如下图所示:

FLV 视频标识头(FLV VideoTagHeader)结构如下图所示:

FLV 视频标识结构体(FLV VideoTagBody)结构如下图所示:

3. Message 和 Chunk 的组成关系

3.1 Message 结构组成:

3.2 Message 拆分 Chunk 实例:

4. Message 类型

Message 消息主要分为三类: 协议控制消息、数据消息、命令消息等。

a.协议控制消息

Message Type ID = 1~6,主要用于协议内的控制。

b.数据消息

Message Type ID = 8 9 18(15),其中

8: Audio 音频数据

9: Video 视频数据

18(15): 对应 AMF0(AMF3),Metadata 包括音视频编码、视频宽高等信息。

c.命令消息 Command Message (20, 17)

此类型消息主要有 NetConnection 和 NetStream 两个类,两个类分别有多个函数,该消息的调用,可理解为远程函数调用。

最后来张图吧,这样更形象点:

三、建立握手

1. 连接失败(两次试探)

2. 连接成功(握手)

2.1 握手流程:

2.1.1 简单握手模式

2.1.2 复杂握手模式

接下来看一个连接实例,结合 wireshark 抓包结果来看一下整个流程:

2.2 推流

2.3 拉流

四、保存文件

以 flv 文件格式为例,可以通过文件开头的三个字节来判断该文件是否为 FLV,其中 F(46)、L(4c)、V(56)。

五、与其他协议对比

其实,与 RTMP 类似的流媒体协议,还有 HLS、HTTP-FLV,下图对三者进行了一个简单的对比。

音视频传输协议之 RTMP相关推荐

  1. 音视频传输协议众多, 5G时代不同业务应该如何选择?

    摘要:音视频传输协议众多, 不同业务应该如何选择? RTSP.RTMP.RTP/RTC.HLS.MSS.DASH.WEBRTC.RIST.SRT:在此我们就从业务发展的视角来理解各种流媒体协议,帮助大 ...

  2. Linux音视频学习--常见的音视频传输协议及基本概念介绍

    一.引言 二.流媒体格式与介绍 ------> 1.相关格式 ------------> 1.1.视频流编码格式 ------------> 1.2.音频流编码格式 ------&g ...

  3. AVB音视频传输协议简介

    一.音视频传输面临的主要问题 二.如何解决这些问题 1. 网络传输问题 2. 媒体时钟同步问题 三.AVB体系 1.协议框架 2. 网络拓扑 3. 典型应用场景 a. 车载娱乐系统 b. 大型演唱会现 ...

  4. 简单了解音视频传输协议SDP、RTP、RTMP、SIP等

    SDP 会话描述协议(SDP)为会话通知.会话邀请和其它形式的多媒体会话初始化等目的提供了多媒体会话描述.参考RFC2327(Request For Comments(RFC),是一系列以编号排定的文 ...

  5. 几种常见音视频传输协议使用总结

    RTSP.RTMP.HTTP.SIP协议是常见的几种音视频解决方案传输协议. (1).RTMP协议 RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写. ...

  6. 常用音视频传输协议汇总

    参考 https://github.com/aggresss/spec ISO/IEC ISO/IEC 13818 Part 1: Systems Part 2: Video Part 3: Audi ...

  7. SRT、RTMP、NDI视频传输协议对比

    一.SRT和NDI两种低延时传输协议的比较 关于SRT: SRT是由Haivision和Wowza共同创建的互联网传输协议,是时下非常受欢迎的开源低延迟视频传输协议.使用SRT传输技术,能够成功实现普 ...

  8. 实时音视频数据传输协议介绍

    概述 随着移动互联网的快速发展以及智能终端性能的逐步提高,智能终端间进行实时音视频通讯成为移动互联网发展的一个重要方向.那么如何保证智能终端之间实时音视频数据通讯成为一个很现实的问题. 实际上,实时音 ...

  9. QOS FEC NACK 实时音视频传输库测试报告(声网、腾讯实时音视频测试)

                        目录 QOS-FEC-NACK传输库简介 实验环境 测试DEMO说明 测试项说明 测试结果 竞品分析 总结                     QOS FE ...

  10. 即时通讯音视频开发(十四):实时音视频数据传输协议介绍

    概述 随着移动互联网的快速发展以及智能终端性能的逐步提高,智能终端间进行实时音视频通讯成为移动互联网发展的一个重要方向.那么如何保证智能终端之间实时音视频数据通讯成为一个很现实的问题. 实际上,实时音 ...

最新文章

  1. 【c语言】蓝桥杯算法训练 整除问题
  2. python 异步io_python之同步IO和异步IO
  3. HDU - 6071 Lazy Running 同余最短路 + 分层
  4. imagesLoaded-检测图片是否正确加载的js插件
  5. 64位电脑mysql_Windows 64位操作系统下安装和配置MySQL
  6. ssh远程连接不上linux
  7. OSPF建立邻居、邻接关系 学习笔记
  8. Python破解wifi密码
  9. python cpk计算器_Python进行CPK计算
  10. usb线连接android设备连接不上,安卓手机USB数据线连接不上电脑怎么办
  11. Chrome 插件下载网站+6个实用插件推荐
  12. linux 755是什么意思
  13. 联想电脑尺寸在哪里看_联想电脑型号怎么查看【详细介绍】
  14. k8s.gcr.io、gcr.io仓库的镜像下载
  15. 利用 GDB 快速阅读 postgresql 的内核代码
  16. Exchange 2013接收连接器以及邮件客户端若干问题介绍
  17. sudo spctl --master-disable
  18. 用毛毛狗的耳朵擦眼泪
  19. Metal每日分享,颜色转换滤镜效果
  20. option 82是dhcp报文中的中继代理

热门文章

  1. java学习之路-练习题:编写一个计算速度的程序,距离时间常量。
  2. 大前研一《思考的技术》
  3. 工具-常识-证件照使用底色的RGB,红白蓝底色,护眼色
  4. 有机酸的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  5. CSS Bulma 框架
  6. 悲剧!广电总局12月11日将封闭的网站目录!!!
  7. 【OpenGL ES】纹理
  8. 给初学者:用VB写外挂 ———— 如何给外挂定义一组热键:红色警戒五项属性修改器VB版
  9. Python报错:ValueError: operands could not be broadcast together with shapes
  10. 记录下准备蓝桥杯的过程吧