直播通信过程
- 主播客户端在分享自己的音视频媒体流之前,首先要向信令服务器发送“创建房间”的信令
- 信令服务器收到该信令后,给主播客户端返回一个推流地址(CDN 网络源站地址)
- 此时,主播客户端就可以通过音视频设备进行音视频数据的采集和编码,生成 RTMP 消息,最终将媒体流推送给 CDN 网络
- 当观众端想看某个房间里的节目时,要向信令服务器发 “加入房间”消息
- 信令服务端收到该消息后,会根据用户所在地区,分配一个与它最接近的“CDN 边缘节点”
- 观众客户端收到该地址后,就可以从该地址拉取媒体流了
CDN网络
- 先要先在各运营商内构建云服务,然后再将不同运营商的云服务通过光纤连接起来,从而实现跨运营商的全网 CDN 云服务
- 每个运营商云服务内部包括了多个节点,按功能分为 3 类:
-
源节点,用于接收用户推送的媒体流
- 源节点接收到媒体数据后,会主动向各个主干结点传送流媒体数据,这样主干结点就将媒体数据缓存起来了
-
主干结点,起到媒体数据快速传递的作用
- 比如与其他运营商传送媒体流,或者缓存源站数据
-
过缘节点,用于用户来主动接流
- 一般边缘节点的数量众多,但机子的性能比较低,它会被布署到各地级市,主要解决网络最后一公里的问题
-
源节点,用于接收用户推送的媒体流
CDN就近接入
- 当用户访问 CDN 网络时,它首先通过智能 DNS 获取与用户距离最近的边缘节点
- 传统 DNS 不判断访问者来源,当有多个 IP 地址可用时,DNS 会随机选择其中一个 IP 地址返回给访问者
- 而智能 DNS 会判断访问者的来源,也就是说,它会对访问者的 IP 地址做判断,对不同的访问者它会返回不同的 IP 地址
- 智能 DNS 可以根据用户的 IP 地址找到它所在的地区、使用的运营商等。通过这些信息,它就可以让访问者在访问服务的时候,获得最优的 CDN 边缘节点,从而提升服务的质量
- 用户在自己地区所在的运营商接入网络,而跨运营商、跨地区的数据传输交由 CDN 网络使用专用网进行传输,这样就可以让用户享受到更好的音视频服务质量了
协议
- 一般使用RTMP推流到CDN,用户再使用HLS协议从CDN拉流
RTMP
-
全称 Real Time Messaging Protocol ,即实时消息协议
-
但它实际上并不能做到真正的实时,一般情况最少都会有几秒到几十秒的延迟
-
底层是基于 TCP 协议的
- 在使用 RTMP 协议传输数据之前,RTMP 也像 TCP 协议一样,先进行三次握手才能将连接建立起来
- 当 RTMP 连接建立起来后,你可以通过 RTMP 协议的控制消息为通信的双方设置传输窗口的大小(缓冲区大小)、传输数据块的大小等
-
优点
- RTMP 是专为流媒体开发的协议,对底层的优化比其它协议更加优秀
- 同时它 Adobe Flash 支持好,基本上所有的编码器(摄像头之类)都支持 RTMP 输出
-
缺点
- 基于 TCP 传输,非公共端口,可能会被防火墙阻拦
- 为 Adobe 私有协议,很多设备无法播放,特别是在 iOS 端,需要使用第三方解码器才能播放
HLS
-
全称 HTTP Live Streaming,是苹果公司实现的基于 HTTP 的流媒体传输协议
-
HLS 协议的本质就是通过 HTTP 协议下载文件,然后将下载的切片缓存起来
-
由于切片文件都非常小,所以可以实现边下载边播的效果
-
优点
- 而 HLS 使用的是 HTTP 协议传输数据,避免了防火墙拦截
- 浏览器天然支持 HLS 协议,而 RTMP 协议需要安装 Flash 插件才能播放 RTMP 流
-
缺点
- 实时性差
- 由于 HLS 往往采用 10s 的切片,所以最小也要有 10s 的延迟,一般是 20~30s 的延迟,有时甚至更差
- HLS 使用的是 HTTP 短连接,且 HTTP 是基于 TCP 的,所以这就意味着 HLS 需要不断地与服务器建立连接
- 实时性差
-
HLS将多媒体文件或直接流进行切片,形成一堆的 ts 文件和 m3u8 索引文件并保存到磁盘。当播放器获取 HLS 流时,它首先根据时间戳,通过 HTTP 服务,从 m3u8 索引文件获取最新的 ts 视频文件切片地址,然后再通过 HTTP 协议将它们下载并缓存起来。当播放器播放 HLS 流时,播放线程会从缓冲区中读出数据并进行播放
FLV
-
LV (Flash Video) 是一种在网络上传输的流媒体数据存储容器格式。
- 格式相对简单轻量,不需要很大的媒体头部信息,因此加载速度极快
- 采用 FLV 格式封装的文件后缀为 .flv
-
由于 FLV 是流式的文件格式,所以它特别适合在音视频录制中使用
-
整个 FLV 由 The FLV Header, The FLV Body 以及其它 Tag 组成
- FLV 相较 MP4 等多媒体文件,它的文件头是固定的,音视频数据可以随着时间的推移随时写入到文件的末尾
- MP4 之类的文件,文件头是随着数据的增长而增长的,并且体积大,处理时间长
- 这样的文件结构有一个天然的好处,就是你可以将音视频数据随时添加到 FLV 文件的末尾,而不会破坏文件的整体结构
- 在众多的媒体文件格式中,只有 FLV 具有这样的特点。像 MP4、MOV 等媒体文件格式都是结构化的,也就是说音频数据与视频数据是单独存放的。当服务端接收到音视频数据后,如果不通过 MP4 的文件头,你根本就找不到音频或视频数据存放的位置
- FLV 相较 MP4 等多媒体文件,它的文件头是固定的,音视频数据可以随着时间的推移随时写入到文件的末尾
- FLV文件本身需要flash插件才能在PC端播放
- 目前,各大浏览器厂商默认都是禁止使用 Flash 插件的。之前常见的 Flash 直播方案,到现在已经遇到极大的挑战。因为它需要用户在浏览器上主动开启 Flash 选项之后才可以正常使用,这种用户体验是非常糟糕的
-
flv.js 项目可以解析 FLV 文件,从中取出音视频数据并转成一种 MP4 格式,然后交给 HTML5 的
<video>标签进行播放- 通过这种方式,使得浏览器在不借助 Flash 的情况下也可以播放 FLV 文件了