流媒体协议是服务器与客户端之间通信遵循的规定。
RTSP
该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP提供了一个可扩展框架,使实时数据,如音频与视频的受控、点播成为可能。数据源包括现场数据与存储在剪辑中的数据。该协议目的在于控制多个数据发送连接,为选择发送通道,如UDP、多播UDP与TCP提供途径,并为选择基于RTP上发送机制提供方法。
RTMP
RTMP是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据实时传输开发的开放协议,因为是开放协议所以都可以使用。
- RTMP协议用于对象、视频、音频的传输,这个协议建立在TCP协议或者轮询HTTP协议之上。
- RTMP协议就像一个用来装数据包的容器,这些数据可以是FLV中的视音频数据。一个单一的连接可以通过不同的通道传输多路网络流,这些通道中的包都是按照固定大小的包传输的。
HLS
HTTP Live Streaming 把整个流分成一个个基于 HTTP 的文件来下载,每次只下载一些。HLS 协议由三部分组成:HTTP(传输协议)、M3U8(索引文件)、TS(音视频媒体信息)。
编码格式要求:
视频编码格式:H264
音频的编码格式:AAC、MP3、AC-3
视频的封装格式:ts
保存 ts 索引的 M3U8 文件
优势:
相对于 RTMP 来讲使用了标准的 HTTP 协议来传输数据,可以避免在一些特殊的网络环境下被屏蔽
在服务端做负载均衡要简单。因为 HLS 是基于无协议的 HTTP 实现的,客户端只需要按照顺序下载存储在服务器的普通 ts 文件进行播放即可。而 RTMP 是一种有状态协议,很难对视频服务器进行平滑扩展,因为需要为每一个播放视频流的客户端维护状态。
HLS 协议本身实现了码率自适应,在不同的带宽情况下,设备可以自动切换到最适合自己码率的视频播放。
劣势:
延迟,很难做到 10s 以下,而 RTMP 可以降到 3s~4s。
M3U8
EXTM3U
- 首行
EXT-X-VERSION
- 格式版本
EXT-TARGETDURATION
- 最大切片时长的四舍五入值
EXT-X-MEDIA-SEQUENCE
- 直播切片序列
EXTINF
- 每个切片时长
- 下方为分片路径
EXT-X-ENDLIST
- 不会产生更多切片,该 M3U8 停止更新
EXT-X-STREAM-INF
多级 M3U8 文件,支持二级
后接参数:
- BANDWIDTH,最高码率值
- AVERAGE-BANDWIDTH,平均码率值
下面接子 M3U8 路径
客户端逻辑
- 通过给定URI获取播放列表。若是Master Playlist,客户端选择一个Variant Stream来播放。
- 客户端检查
#EXT-X-VERSION
版本是否满足。 - 客户端忽略不可识别的tags、属性键值对。
- 加载Media Playlist,选择一个segment开始播放。
- 播放完一个segment后,根据客户端当前的具体情况选择一个新的segment,并重复执行播放操作。
- 对与直播,需要定期刷新Media Playlist,并选择合适的segment播放。
客户端码率切换
HLS服务器提供几种可选的码率。客户端需要自主完成码率切换。客户端判断是否切换码率的因素:
- 设备实际的下载速度(与Master Playlist的Variant Stream标签中的码率/带宽做比较)
- 设备运行情况(CPU、内存、屏幕分辨率)