视频直播知识之二:推流、拉流和服务端处理

前言

这篇文章主要记录在采集端推流,在拉流端拉流所使用的流媒体传输协议,以及在服务器端进行转码、安全检测和CDN分发等相关知识。

同系列文章:

  1. 视频直播知识之一:数据的采集和编码
  2. 视频直播知识之二:推流、拉流和服务端处理
  3. 视频直播知识之三:播放端播放
  4. 视频直播知识之四:直播DEMO——RTMP推流和HTTP-FLV拉流

1 推流和拉流

  • 推流,指把采集阶段封包好的内容传输到服务器的过程。要想用于推流还必须把音视频数据使用传输协议进行封装,变成流数据。常用的传输协议有RTSP、RTMP、HLS等。
  • 拉流,指服务器已有直播内容,根据协议类型(如RTMP、RTP、RTSP、HTTP等),与服务器建立连接并接收数据,进行拉取的过程。

接下来,介绍推流和拉流常用的流媒体传输协议。

2 流媒体传输协议

2.1 RTMP(推流和拉流)

RTMP(Real Time Messaging Protocol,实时消息传输协议)是目前主流的流媒体传输协议,广泛用于直播领域。是Macromedia(后被Adobe收购)为Flash Video(Flash播放器,简称flv)开发的私有协议,视频必须是H264编码,音频必须是AAC或MP3编码,基本都封装成FLV(flv tag)格式的流文件。

优点:

  • 专为流媒体开发的协议,对底层的优化比其它协议更加优秀,
  • 在采集端,基本上所有的编码器(拍照app之类)都支持RTMP输出;在拉流端,PC端主流浏览器(特别是windows的浏览器)对flash播放器支持程度高。
  • 延迟相对较低,一般延时在 2-5s 之间,适用于一般的视频会议,互动式直播
  • CDN 支持良好,主流的 CDN 厂商都支持

缺点:

  • 基于TCP,传输成本高,在弱网环境下问题显著。且RTMP协议本身初次建立连接的时候握手过程也较复杂。
  • FLV格式的流文件必须使用flash播放器才能播放,移动端浏览器支持程度低。

2.2 HTTP-FLV (拉流)

HTTP-FLV ,即将流媒体数据封装成 FLV 格式,然后通过 HTTP 协议传输给客户端。

优点

  • HTTP长连接,可以通过 HTTP 302 跳转灵活调度/负载均衡,支持使用 HTTPS 加密传输。
  • HTTP本身没有复杂的状态交互。所以从延迟角度来看,HTTP-FLV要优于RTMP。

缺点

  • 数据格式是flv,与RTMP一样,面临浏览器兼容的问题。需要借助Flv.js库实现,而Flv.js也有部分浏览器不支持

    Flv.js,一个实现了在 HTML5 视频中播放 FLV 格式视频的 JavaScript 库。它的工作原理是将 FLV 文件流转码复用成 ISO BMFF(MP4 碎片)片段,然后通过 Media Source Extensions 将 MP4 片段不断往video容器里添加数据,达到更新视频内容的目的。

2.3 HLS(拉流)

HLS (HTTP Live Streaming), 是由 Apple 公司实现的基于 HTTP 的媒体流传输协议。它把一段视频流,分成一个个小的基于HTTP的文件来下载。当媒体流正在播放时,客户端可以根据当前网络环境,方便地在不同的码率流中做切换,以实现更好的观影体验。
传输内容包括两部分:
1.M3U8描述文件;
2.TS媒体文件。TS媒体文件中的视频必须是H264编码,音频必须是AAC或MP3编码。

优点

  • 可以用HTML5video播放,浏览器兼容性较好

缺点:

  • 首次握手时间较长,HLS 首次连接时,总共的延时包括:TCP 握手,m3u8 文件下载,ts 文件下载。
  • 直播延迟较高,需要5-20s延迟。根据ts切片间隔,每隔一段时间生成 TS 文件,并更新 M3U8 文件。比如间隔为12s,直播的环境里媒体服务器要等到12s的数据推上来才能返回给播放端。

2.4 DASH(拉流)

DASH(Dynamic Adaptive Streaming over HTTP) ,是一种在互联网上传送动态码率的Video Streaming技术。类似于苹果的HLS,都通过 HTTP 运行,使用 TCP 作为其传输协议,通过配套的索引文件将视频分成多个片段,并提供自适应比特率流式传输。B站,youtube都在使用。

与HLS的区别

  • 编码格式:MPEG-DASH 允许使用任何编码标准。HLS 与之相反,需要使用 H.264 或 H.265。
  • 分段:MPEG-DASH 通常将视频分割成比 HLS 更小的片段进行交付。HLS 的默认段长度为 10 秒,而 MPEG-DASH 片段的长度通常为 2-4 秒。
  • 标准化:MPEG-DASH 是国际标准。HLS 由 Apple 开发,尽管已得到广泛支持,但尚未作为国际标准发布。
  • HTML5 支持:HLS 自动受到 HTML5 的支持,但 MPEG-DASH 不行,需要借助Dash.js库(与Flv.js类似,利用Media Source Extensions播放 MPEG-DASH 内容)。

2.5 WebRTC(推流和拉流)

WebRTC (Web Real-Time Communications) 是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间 点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输,常用于视频/电话会议和连麦中。
WebRTC架构如下图,从上往下分别是:
WebRTC架构

  • Web API 层:面向前端开发者提供标准API(javascirpt),即对webrtc的核心层的C++ API的封装。
  • WebRTC C++ API层:提供给WebAPI层的核心层的C++ API,包括媒体捕获设备管理和连接。
  • Session层:上下文管理层,音频、视频、非音视频的数据传输
  • 设备引擎和传输模块:音频引擎、视频引擎、传输模块。在传输模块中:
    • RTP(Real-time Transport Protocol或简写RTP)是一个网络传输协议,详细说明了在互联网上传递音频和视频的标准数据包格式。SRTP(SecureReal-time Transport Protocol)是在RTP的基础上加入了安全机制的传输协议;
    • 多路复用(Multiplexing),多个流复用同一个通道。
    • 利用 NAT 穿透技术连接远程节点,实现 P2P,如 ICE、STUN 和 TURN。

      对等式网络(简称 P2P),是无中心服务器、依靠用户群(peers)交换信息的互联网体系,它的作用在于,减低以往网路传输中的节点,以降低资料遗失的风险。
      NAT(Network Address Translation),是在IP数据包通过路由器或防火墙时重写来源IP地址或目的IP地址的技术,主要是将内部的私有IP地址(private IP)转换成可以在公网使用的公网IP(public IP),最初为了解决公网IP地址短缺问题。因此,在p2p网络中,需要 NAT 穿透技术才能在外网传输。

  • 硬件设备:包括音视频的采集设备、网络IO。

优点:

  • 底层基于 SRTP 和 UDP,弱网情况优化空间大
  • 可以实现点对点通信,通信双方延时低
  • 对于Web开发,W3C 标准,PC端主流浏览器支持程度高。Google 在背后支撑。

缺点:

  • UDP 的可靠性传输,如丢包重传、网络抖动的处理
  • 移动端浏览器支持度低
  • ICE,STUN,TURN 传统 CDN 没有类似的服务提供
  • 涉及多个协议,学习成本比较高。

2.6 小结

在直播推流的场景中,RTMP 协议为流媒体而设计,且比起WebRTC,CDN支持度较高,在推流中使用RTMP比较多。
在直播拉流的场景中,

RTMP HTTP-FLV HLS DASH
连接 HTTP 短连接 TCP 长连接 HTTP 长连接 HTTP 长连接
数据分段 连续流 连续流 切片 切片
延时 慢(根据切片情况) 慢(切片间隔通常比HLS更短)
Web 兼容性 较差 较差,但可以利用MediaSource实现 较差,但可以利用MediaSource实现。编码格式的支持和标准化比HLS好
  • 优先使用 HTTP-FLV,因为它延迟小,性能也不差。
  • 不支持 flv.js 就使用 Flash播放器播 RTMP 流。
  • 不想用Flash兼容也可以用DASH/HLS,但延迟较高。

3 服务器处理

3.1 转码

码率,是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。码率越大,精度越高,处理出来的文件就越接近原始文件,文件体积也越大。
转码(Video Transcoding)是指将已经压缩编码的视频码流转换成另一个视频码流,以适应不同的网络带宽、不同的终端处理能力和不同的用户需求。转码本质上是一个先解码,再编码的过程,因此转换前后的码流可能遵循相同的视频编码标准,也可能不遵循相同的视频编码标准。

在直播的场景中,实时转码功能即为同一路推流同时提供多种码率(清晰度)的播流地址服务,以达到播放端实现清晰度切换。
清晰度对应的分辨率和码率一般如下:

清晰度 分辨率(高、宽自适应) 码率(Kbps)
流畅 360 460
标清 432 640
高清 648 1200
超清 1080 2100

在上传视频的场景中,转码还包括:把各种格式的视频转成兼容性高的格式如mp4;输出gif;倍速转码等等。

3.2 安全检测

视频检测,鉴黄,暴恐识别等。

3.3 CDN分发

内容分发网络(CDN)能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。
直播传输网络有别于传统 CDN 的痛点:

  • 流媒体协议的支持,包括 RTMP,HLS ,HTTP-FLV 等。
  • 从推流端到播放端,延迟控制在 1~3 秒之间。
  • 中国公司出海已成大势,CDN 需要更多的海外节点。

参考