一、RTMP是什么?
RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。RTMP与HTTP一样,都属于TCP/IP四层模型的应用层。
二、RTMP与HLS比较
HLS HLS 的基本原理就是当采集推流端将视频流推送到流媒体服务器时,服务器将收到的流信息每缓存一段时间就封包成一个新的 ts 文件,同时服务器会建立一个 m3u8 的索引文件来维护最新几个 ts 片段的索引。当播放端获取直播时,它是从 m3u8 索引文件获取最新的 ts 视频文件片段来播放,从而保证用户在任何时候连接进来时都会看到较新的内容,实现近似直播的体验。相对于常见的流媒体直播协议,例如 RTMP 协议、RTSP 协议等,HLS 最大的不同在于直播客户端获取到的并不是一个完整的数据流,而是连续的、短时长的媒体文件,客户端不断的下载并播放这些小文件。这种方式的理论最小延时为一个 ts 文件的时长,一般情况为 2-3 个 ts 文件的时长。HLS 的分段策略,基本上推荐是 10 秒一个分片,这就看出了 HLS 的缺点: 1.通常 HLS 直播延时会达到 20-30s,而高延时对于需要实时互动体验的直播来说是不可接受的。 2.HLS 基于短连接 HTTP,HTTP 是基于 TCP 的,这就意味着 HLS 需要不断地与服务器建立连接,TCP 每次建立连接时的三次握手、慢启动过程、断开连接时的四次挥手都会产生消耗。 不过 HLS 也有它的优点: 1.数据通过 HTTP 协议传输,所以采用 HLS 时不用考虑防火墙或者代理的问题。 2.使用短时长的分片文件来播放,客户端可以平滑的切换码率,以适应不同带宽条件下的播放。 3.HLS 是苹果推出的流媒体协议,在 iOS 平台上可以获得天然的支持,采用系统提供的 AVPlayer 就能直接播放,不用自己开发播放器。
RTMP 相对于 HLS 来说,采用 RTMP 协议时,从采集推流端到流媒体服务器再到播放端是一条数据流,因此在服务器不会有落地文件。这样 RTMP 相对来说就有这些优点: 1.延时较小,通常为 1-3s,参考播放器 如ijkplayer、毫秒级的播放器,可以参考大牛直播SDK的RTMP播放器。 2.基于 TCP 长连接,不需要多次建连。 因此业界大部分直播业务都会选择用 RTMP 作为流媒体协议。通常会将数据流封装成 FLV 通过 HTTP 提供出去。但是这样也有一些问题需要解决: 1.iOS 平台没有提供原生支持 RTMP 或 HTTP-FLV 的播放器,这就需要开发支持相关协议的播放器。
三、RTMP创建流的基本流程
基本流程: 1.socket建立连接 2.RTMP握手 3.建立RTMP连接 4.创建RTMP流
1. RTMP握手
RFC文档握手流程: 实际握手流程
2. 建立RTMP连接
交互滑动窗口大小;设置带宽 RFC文档连接流程: 实际连接流程
3. 创建RTMP流
如果有流要先释放掉 无实际作用flash communication 创建流 返回状态 推流过程 metadata中包含音视频的基本信息,如分辨率,采样大小等 拉流过程 RTMP处理流程:
- 首先,我们在RTMP连接之前,要创建 socket,通过socket建立tcp连接
- 在 tcp 上,创建 rtmp connection
- 然后rtmp 握手协议
- 握手结束,创建连接
- 创建结束,创建流
- 创建流结束,主播端,推送流,公众端,接受流 /拉流
四、RTMP消息结构
basic header(2bit fmt + 6bit data(2~63))必填,message header与extended timestamp可选 data = 0时 basic header为2字节,CSID范围为64到64+2的8次方;data = 1时,basic header为4字节,CSID范围为64+2的8次方到64+2的8次方+2的24次方;data为2~63时,basic header为1字节,data此时为chunk stream ID即CSID Message header 当数据量大,需要拆分多个块传输时,第一个块的message header四个部分都是存在的,后面的块如果与前面块的streamID,TypeID等相同,则可以省略 Extended timestamp 三字节时间辍无法表示时,置为FFFFFF,则扩展时间辍存在 2:结束当前流,3:设置ack,从哪个ack开始确认,4:设置滑动窗口大小,5:设置传输带宽 15,18:AMF为flash的编码格式,data message一般为meta数据 17,20:创建流,推流,拉流都属于命令消息
RTMP的握手没有header和body
RTMP消息详解:https://www.jianshu.com/p/df987acf1246
五、RTMP与FLV协议关系
|