常见的三大直播协议

Posted by RussXia on July 13, 2021

常见的三大直播协议

简介

关于直播场景,常见的三大直播协议:RTMP、HTTP-FLV、HLS等。

RTMP

全称”Real Time Messaging Protocol“,使用TCP,默认在1935端口上传输一般的FLV格式流,在浏览器端依赖于Flash。

优点:支持加密,隐私性好;实时性好,延迟相对较低

缺点:非公共端口(e.g.:80,443等),可能被防火墙封;跨平台很差,很多设备/浏览器无法播放,特别是在ios端,依赖第三方解码器才能正常播放。

H5中video标签无法播放RTMP协议,可以通过引入video.js来实现播放。

其原理是将大块的视频帧和音频帧拆分成更小的消息块(Chunk),然后将分割后的消息块通过TCP协议传输,接受端再接受反解码消息块恢复成流媒体数据。因此,RTMP天然支持加密。但是由于拆包组包的过程比较复杂,所以海量并发时可能会不稳定。

HLS

全称”HTTP Live Streaming“,是苹果提出的,基于HTTP的流媒体传输协议,H5可以直接打开播放。后来Chrome浏览器、移动端浏览器、包括微信内嵌的浏览器都提供了原生支持,所以HLS是一个跨平台比较好的方案。

优点:跨平台性好,Apple全系列支持,包括Android、Chrome等都支持;基础http:80/443传输,避免防火墙拦截;支持CDN分发,且自带多码率适应

缺点:实时性差,延迟高(延迟基本在10s以上);文件碎片多

其原理是把整个流切成一片片小文件,然后基于http下载,浏览器使用的是m3u8文件(可以简单理解为包含多个ts文件的playlist,ts可以走cdn)。

img

m3u8说明

m3u8 文件实质是一个播放列表(playlist),需要不断去请求新的ts文件才能续播。

  • 视频的封装格式是TS。
  • 视频的编码格式为H264,音频编码格式为MP3、AAC或者AC-3。
  • 除了TS视频文件本身,还定义了用来控制播放的m3u8文件(文本文件)

m3u8文件大致文件内容:

# EXTM3U
每一个m3u8文件开头必须为这个tag,用作标示。
# EXT-X-VERSION
用于标示版本,当前版本为3,有且只能有一个,默认为1。
# EXT-X-TARGETDURATION
每一片的最大长度,部分iphone设备此参数不正确会导致无法播放。
# EXT-X-MEDIA-SEQUENCE
切片的开始序号,且每一片的序号具有唯一性,相邻序号递增以保持流的连续性。
# EXTINF
切片的实际时长。
# EXT-X-PLAYLIST-TYPE
类型
# EXT-X-ENDLIST
结束符号。

HTTP Live Streaming 的相关MIME(HLS requirements)

File Extension MIME Type Description
.m3u8 application/vnd.apple.mpegurl playlist file that contains a path to a media file or directory of media files and meta information about the playlist
.ts video/mp2t video stream file
.m4s video/iso.segment or video/mp4 fragmented media segment
.m4a audio/mp4 audio file encoded with advanced audio coding
.m4v video/mp4 video container format
.mp4 video/mp4 video segment or media initialization segment

HTTP-FLV

FLV(Flash Video)是Adobe公司推出的流媒体存储容器格式。HTTP-FLV基于HTTP流式IO传输FLV,依赖浏览器支持播放FLV。播放能力基于Media Source Extensions(MSE)。

优点:格式简单(FLV是个极简单的协议);延时低;大规模并发方面很成熟

缺点:移动端兼容性差(iOS的safari、IE11部分兼容),部分低版本的iOS微信端也不支持。

MSE 是一个W3C草案,MSE扩展了HTML5的Video和Audio标签能力,允许开发者通过JS来从服务端拉流提供到HTML5的Video和Audio标签进行播放。

目前MSE的兼容情况:https://caniuse.com/?search=Media%20Source%20Extensions

原理

MSE目前支持的视频封装格式是MP4,支持的视频编码是H.264和MPEG4,支持的音频编码是AAC和MP3。目前的处理方式主要有两种:

  1. 在服务端提前转封装好成MP4格式传输,在前端直接通过MSE接口来播放。
  2. 从服务端拉裸流(flv)过来,在前端将flv合成MP4片段进行播放。

一般方案都是客户端拉取解封装FLV,然后再转成MP4,再经由MSE播放,解FLV转MP4的过程,可以靠 flv.js 实现。

总结

协议 HTTP-FLV RTMP HLS
传输协议 HTTP TCP HTTP
视频封装格式 FLV FLV Tag ts
延时
数据分段 连续流 连续流 切片文件
H5播放 可通过h5解封数据包播放(flv.js) 不支持 可通过h5解封数据包播放

在降低延时方面,选择HTTP-FLV作为播放协议能有效地降低时延。

HLS对浏览器兼容比较友好,且支持跨终端。

随着Flash的淘汰,RTMP不支持H5播放,且CDN不支持基于TCP的RTMP协议,所以需要考虑成本、稳定性、集成开发工作等。

参考引用