直播答题背后的技术原理

2018年仅仅过去了一个礼拜,就迎来了今年的第一个风口----直播答题闯关赢现金。这场由国民老公点燃的战火一触即发,大有愈演愈烈之势。不仅有思聪力挺的冲顶大会,更有作为花椒直播背后的老板周鸿祎,西瓜视频老板张一鸣等大佬也纷纷加入到这场“大撒币”中来。直播答题的具体规则如下:

  • 平台方在某个整点有一名出题官发起直播,并设有一定数量的奖金;
  • 用户观看直播并答题,共12道题,全部答对的所有用户平分全部奖金;
  • 若答错某题,则不能继续作答。但如果有复活卡,每场直播可自动复活一次;
  • 每道题为三选一,须在10s内做出选择,一旦选择,无法更改答案,超时未选或选错则失败。

<!--more-->

从以上规则中可以看出,直播答题的最大难点在于实时性可高并发性。实时性是指每道题目只有10s的作答时间,运营方对题目的下发需要精确到秒级。否则时间太长会导致作弊,时间太短对用户不公平。高并发性是指单场直播会突然涌入百万级的用户观看,我看过的某平台最高单场有两百多万人参与。这对服务器架构设计和流量成本就有很高的要求。

说实话,我算不得“内行”,但也来凑凑这里面的“门道”。

直播技术概述

直播自从16年成为风口后,到现在已经涌现出许多平台,其中不乏映客、花椒、美拍等行业标杆。在技术上已经比较成熟。一场完整的直播从主播发起直播到观众观看直播包括采集--编码--传输--源站处理--分发CDN--解码观看这几个步骤。

采集

一般对流媒体的采集包括视频和音频的采集,分别通过手机摄像头和麦克风设备来完成。摄像头在1s内连续记录的多个画面,称为“帧”,每一帧可以理解为一张图片,在播放端快速播放多个连续的帧就形成了视频。而音频则是对人发出的声波进行采样,然后进行模数转换,将之转换为数字信号。

编码

采集到音视频数据后,还需要进行编码才能在网络上传输。我这里所说的编码不仅仅是指将音视频数据按照一定的格式进行组织,也包括对视频的压缩。试想一部时长两小时、分辨率为1920x1080,每秒20帧的电影如果不经过压缩,其大小将达到2224G!这简直是不可想象的。 以视频为例,摄像头采集的原始数据数据为YUV帧,对这些帧进行宏块划分、帧内和帧间预测、运动估计和运动补偿、再将得到的稀疏矩阵经过离散余弦变换,就可以得到H264裸码流。最后再将其封装为flv格式,就可以进行传输了。

传输、源站、CDN

流媒体在网络上的传输是比较重要的一个环节,尤其是对直播来说。因为直播类音视频的一个基本要求就是实时性,因此要尽可能缩短在网络上的延迟。包括从传输协议、传输链路、各端之间处理等方面的选型和优化。

现在普遍选用的传输协议是RTMP协议,称为实时消息传输协议,是Adobe公司发布的。从功能和命名上看,他就是为实时传输消息而设计的,因此很适合于直播流的传输。对应的开源项目一般有nginx-rtmp-module,SRS,CRTMPD,FMS,WOWZA等。

在链路层面,主要是尽可能去优化路由,避免跨网络跨运营商情况,缩短数据包在主播和观众之间的跳数。一般来说,跨运营商和跨地区会导致丢数据的现象。跨运营商会带来两个问题:

  1. 运营商数据交汇点不一定在本地,需要绕远路;
  2. 高峰期可能会拥堵; 因此在观众观看直播时,需要就近拉取,同时也需要尽可能保证电信用户走电信通道,联通走联通通道等。

同时,主播和观众往往是一对多的关系。若主播所以在观众端可以通过cdn来进行拉流分发,以缓解源站的压力。CDN全称为Content Delivery Network,即内容分发网络。在另一方面,观众观看直播时,会到就近的CDN边缘节点进行拉取,也可以提升连接质量,缓解因链路而引起的丢帧问题。

解码

解码是编码的逆过程。观众端拿到直播数据后,需要进行解封装--解码的过程,然后将得到的音视频数据分别送到扬声器和屏幕上。

直播答题技术的挑战

而直播答题是在直播的模式之上,加入的一种新型互动玩法。这就要求在技术上不仅要达到直播的低延迟要求,同时也要满足题目和直播流的同步。题目出现过早或过晚都不行,过早,主持人还没开始念题,题目已经弹出;过晚,主持人都念完了,题目才弹出,容易导致作弊。而题目通常是通过IM通道下发的,与直播属于两个不同的通道,这之间的同步如何保证?

答案就是SEI。SEI称为补充增强信息(Supplemental Enhancement Information),是H.264和H.265协议中规定的一种NAL unit,用来向视频中加入一些额外信息,如视频版权等。可以在视频编码端或传输端加入。

这里我们需要在SEI中加入时间戳相关信息。在观众参与答题时,为尽可能保证时间戳的准确性,可在CDN边缘节点上再加入,同时在IM通道中设定题目在哪一个时间点应该出现。这样,客户端就可以根据这个时间戳进行同步,精确到某一帧再弹出题目或答案,保证了答题时间的准确性。