RTMP, Real Time Messaging Protocol实时消息传送协议, RTMP协议既可以传输AMF格式数据,也可以传输FLV格式数据。
主要应用于娱乐直播和点播的场景中, 苹果公司推出的HLS协议有替代RTMP协议的趋势, 但在国内RTMP应用还是比较广泛的, 原因一, RTMP在传输效率和实时性上要比HLS高很多. 原因二, RTMP存活时间较长, 各个厂商都投入较大成本应用和推广, 技术较成熟. 未来很可能被基于UDP的传输协议所替代, 因为TCP效率较低 冗余较大, 整个连接过程会话费较长时间, 一旦网络出现问题,应对策略过于复杂.
RTMP是APP中最常用的数据流传输协议,它可以做到低延时。RTMP协议进行数据传输时,它将一整条数据流封装成FLV通过HTTP打包、TCP长连接分发出去,在服务器端不产生落地文件,延时通常为 1至3秒,远超HLS。
HLS协议通过切片传输数据,边下载边传输,所以传输延时要比RTMP长。但是,HLS基于HTTP/80 传输,很少会被防火墙拦下。HLS基于无状态协议(HTTP)支持平滑扩展,RTMP对视频服务器进行平滑扩展困难。
HLS可以实现流媒体的直播和点播。该协议主要为iOS系统服务。
HLS实际上并不是真正的实时流协议,HLS协议在服务器端将数据流存储为连续的、短时长的MPEG-TS格式文件,客户端不断下载并解析播放这些小文件从而实现实时流效果。可以认为,HLS是以点播流技术方式来实现实时流的协议。这样的缺点是延时高。
从上图中得出:
-
RTMP 是基于TCP的
-
建立RTMP连接 需要握手(类似TCP的三次握手)
-
RTMP管道中的数据以流(stream)的形式传输
RTMP创建流的基本流程
-
socket建立TCP连接
-
RTMP握手
-
建立RTMP连接
-
创建RTMP流
RTMP协议中的握手:
RTMP真实的握手:
建立RTMP连接:
协议中RTMP流的创建(左侧为客户端 右侧为服务端)
真实创建RTMP流
-
release Stream : 告诉服务端 如果有这个流的话 要先释放掉
-
FCPublishStream(Flash Communitcation) : 具体作用是什么不得而知, 但是服务端会判断有没有这个消息, 没有的话 就不能创建成功.
-
Status : 服务端对客户端消息的response.
推RTMP流
metaData : 即将要发送的数据的基本信息, 例如, 视频的分辨率、帧率等, 音频的采样率、采样大小、通道数. 服务端可以将这些信息转发给拉流端, 好让拉流端初始化解码器; 也可以自己根据这些参数 对接收的数据加以处理.
拉RTMP流
-
play : 指明我要播放哪个频道中的视频.
-
set Buffer Size : 设置缓冲区大小, 让视频播放的更流畅.
-
Audio/Video Data : 音视频数据