直播通信过程

  • 主播客户端在分享自己的音视频媒体流之前,首先要向信令服务器发送“创建房间”的信令
  • 信令服务器收到该信令后,给主播客户端返回一个推流地址(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文件本身需要flash插件才能在PC端播放
    • 目前,各大浏览器厂商默认都是禁止使用 Flash 插件的。之前常见的 Flash 直播方案,到现在已经遇到极大的挑战。因为它需要用户在浏览器上主动开启 Flash 选项之后才可以正常使用,这种用户体验是非常糟糕的
  • flv.js 项目可以解析 FLV 文件,从中取出音视频数据并转成一种 MP4 格式,然后交给 HTML5 的<video>标签进行播放
    • 通过这种方式,使得浏览器在不借助 Flash 的情况下也可以播放 FLV 文件了

参考

相关文章:

  • 2021-07-05
  • 2022-12-23
  • 2021-08-16
  • 2021-05-20
猜你喜欢
  • 2021-12-02
  • 2021-12-05
  • 2021-06-24
  • 2021-08-12
  • 2021-12-15
  • 2021-04-21
相关资源
相似解决方案