RTMP 协议

440 阅读3分钟

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 : 音视频数据