直播原理

  1. 1. 直播原理与web直播实战
    1. 1.1. 直播构成
    2. 1.2. 直播流程
      1. 1.2.1. 采集
      2. 1.2.2. 前处理
      3. 1.2.3. 编码
      4. 1.2.4. 传输
      5. 1.2.5. 解码
      6. 1.2.6. 渲染
    3. 1.3. web中直播技术
      1. 1.3.1. HLS
    4. 1.4. Server服务器
    5. 1.5. Distribution分配组件
      1. 1.5.1. 主索引文件
      2. 1.5.2. 子索引文件
      3. 1.5.3. 主索引文件与子索引文件的区别
    6. 1.6. client客户端
      1. 1.6.1. videojs-contrib-hls.js组件解析过程
    7. 1.7. RTMP
    8. 1.8. HLS VS RTMP 优缺点对比

直播原理与web直播实战

直播构成

直播构成

直播流程

视频直播可以分为采集,前处理,编码,传输,解码,渲染 这几个环节。

采集

一般是由客户端(IOS、安卓、PC或其它工具,如OBS)完成的,iOS是比较简单的,Android则要做些机型适配工作,PC最麻烦各种奇葩摄像头驱动

前处理

主要是处理直播美颜,美颜算法需要用到GPU编程,需要懂图像处理算法的人,没有好的开源实现,要自己参考论文去研究。难点不在于美颜效果,而在于GPU占用和美颜效果之间找平衡。

编码

肯定要采用硬编码,软编码720p完全没希望,勉强能编码也会导致CPU过热烫到摄像头。编码要在分辨率,帧率,码率,GOP等参数设计上找到最佳平衡点。

传输

一般交给了CDN服务商。

解码

是对之前编码的操作,进行解码,在web里需要解码是HLS。

渲染

主要用播放器来解决,web中常用到的播放器有 video.js ,目前我们使用是腾讯云播放器。

其实一个完成直播,远远不上面这几个环节,下面是腾讯云直播方案的整个流程图:

腾讯云

web中直播技术

目前互联网上web做直播,主要是展示,主流web展示的话可能涉及到HLS跟RTMP这两个东西,现在我们重点讲解hls跟RTMP协议。

HLS

HLS(HTTP Live Streaming全称)是一个基于HTTP的视频流协议,由Apple公司实现,Mac OS上的QuickTime、Safari 以及iOS上的 Safari都能很好的支持 HLS,高版本 Android 也增加了对 HLS 的支持。
一些常见的客户端如:MPlayerX、VLC 也都支持HLS协议,如果需要在chrome上播放,需要使用 videojs-contrib-hls.js 解析。
HLS工作流程图

Server服务器

HLS的服务器组件负责获取的媒体输入流 , 然后Media编码后 MPEG-4(H.264 video 和 AAC audio)格式然后用硬件打包到 MPEG-2 (MPEG-2 transport stream)的传输流中。图中显示,传输流会经过stream segmenter, 这里的工作是MPEG-2传输流会被分散为小片段然后保存为一个或多个系列的 .ts 格式的媒体文件。这个过程需要借助编码工具来完成,比如 Apple stream segmenter。
(视频类是.ts文件,纯音频会被编码为一些音频小片段,通常为 ADTS头的AAC、MP3、或者 AC-3格式。)
服务端可以采用硬件编码和软件编码两种形式,其功能都是按照上文描述的规则对现有的媒体文件进行切片并使用索引文件进行管理。而软件切片通常会使用 Apple 公司提供的工具或者第三方的集成工具。

Distribution分配组件

同时上面提到的那个切片器(segmenter)也会创建一个索引文件,通常会包含这些媒体文件的一个列表,也能包含元数据。它一般都是一个个.M38U的列表。列表元素会关联一个 URL 用于客户端访问。然后按序去请求这些 URL。

索引文件结构图

主索引文件

1
2
3
4
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=409037,RESOLUTION=416x234,CODECS="mp4a.40.2, avc1.42001e"
Gear1/prog_index.m3u8

第一行:#EXTM3U

每个M3U文件第一行必须是这个tag,起标示作用

第二行:#EXT-X-STREAM-INF

标签的属性列表中直接指明当前流是VIDEO还是AUDIO

包含属性 :

  • BANDWIDTH 指定码率
  • PROGRAM-ID 唯一ID (这个属性在后面的协议版本废除了)
  • CODECS 指定流的编码类型
  • RESOLUTION:分辨率

子索引文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#EXTM3U
#EXT-X-TARGETDURATION:11
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:10.133333,
fileSequence0.ts
#EXTINF:10.000666,
fileSequence1.ts
#EXTINF:10.667334,
fileSequence2.ts
#EXTINF:9.686001,
fileSequence3.ts
#EXTINF:9.768665,
fileSequence4.ts
#EXTINF:10.000000,
fileSequence5.ts
#EXT-X-ENDLIST

#EXTM3U m3u文件头,必须放在第一行。
#EXT-X-TARGETDURATION 每个分片TS的最大的时长。
#EXT-X-VERSION 用以标示协议版本。
#EXT-X-MEDIA-SEQUENCE TS分片的序列号。
#EXT-X-PLAYLIST-TYPE 提供关于PlayList的可变性的信息, 这个对整个PlayList文件有效,是可选的。
#EXTINF extra info,分片TS的信息,如时长,带宽等。

主索引文件与子索引文件的区别

  • 主索引文件和子索引文件都是.M3U8的playlist
  • 主索引文件只需下载一次,但对于直播节目子索引文件定期重新加载

client客户端

分配组件由标准的网络服务器。他们负责接受Client客户端请求并提供相关联的资源给客户端。

videojs-contrib-hls.js组件解析过程

videojs-contrib-hls.js解析图

HLS简单讲就是把整个流分成一个个小的片段,基于 HTTP 的文件来下载,每次只下载一小部分。
前面提到了用于 H5 播放直播视频时引入的一个 .m3u8 的文件,这个文件就是基于 HLS 协议,存放视频流元数据的文件。
每一个 .m3u8 文件,分别对应若干个 ts 文件,这些 ts 文件才是真正存放视频的数据,m3u8 文件只是存放了一些 ts 文件的配置信息和相关路径,当视频播放时,.m3u8 是动态改变的,再通过解析器(videojs-contrib-hls.js)解析这个文件,并找到对应的 ts 文件来播放,所以一般为了加快速度,.m3u8 放在 web 服务器上,ts 文件放在 cdn 上。

RTMP

Real Time Messaging Protocol(简称 RTMP)是 Macromedia 开发的一套视频直播协议,现在属于 Adobe。这套方案需要搭建专门的 RTMP 流媒体服务如 Adobe Media Server,并且在浏览器中只能使用 Flash 实现播放器。它的实时性非常好,延迟很小,但无法支持移动端 WEB 播放是它的硬伤。
浏览器端,HTML5 video标签无法播放 RTMP 协议的视频,可以通过 video.js 来实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<link href="http://vjs.zencdn.net/5.8.8/video-js.css" rel="stylesheet">
 
<video id="example_video_1" class="video-js vjs-default-skin" controls preload="auto" width="640" height="264" loop="loop" webkit-playsinline>
<source src="rtmp://10.14.221.17:1935/rtmplive/home" type='rtmp/flv'>
</video>
 
<script src="http://vjs.zencdn.net/5.8.8/video.js"></script>
<script>
videojs.options.flash.swf = 'video.swf';
videojs('example_video_1').ready(function() {
this.play();
});
</script>

HLS VS RTMP 优缺点对比

协议 原理 延时 优点 缺点 使用场景
HLS(http) 集合一段时间数据生成ts切片文件更m3u8文件 10s-30s 跨平台 延时性高 移动端
RTMP(TCP) 每个时刻的数据收到后立即发送 2s 延时低、实时性好 跨平台差 PC+直播+实时性要求高+互动性强