移动体育直播如何达到广电直播流畅度|架构师实践日


编者按:2016 年是直播元年,体育赛事直播发生了从广电垄断的 PGC 模式到 PGC + UGC 模式的转变。PGC 模式使用专有线路和卫星信号,其网络质量可以保证观众观看电视时无卡顿现象。而 PGC + UGC 模式则是利用公网网络。那么,如何利用公网网络做到低延迟、低卡顿,使整个直播过程顺畅?7 月 14 日,在七牛云主办的架构师实践日上,七牛云布道师卜赫带来了 UGC 体育赛事直播如何利用公网网络达到 PGC 的流畅度的分享。以下是对他演讲内容的整理。





屏幕快照 2016-09-05 上午10.26.42


先后供职于 MaxLeap , 七牛云等云计算公司,历任大数据部技术总监,技术布道师等职位,积累了云计算平台的一线开发运维经验。对实时数据分析,海量数据存储有比较深入的理解,同时也对 React Native 有所研究,并积极参与开源社区活动。




基础优化



体育赛事直播发生了从广电垄断的 PGC 模式到 PGC + UGC 模式的转变。PGC 模式使用专有线路和卫星信号,其网络质量可以保证观众观看电视时无卡顿现象。而 PGC + UGC 模式则是利用公网网络。那么,如何利用公网网络做到低延迟、低卡顿,使整个直播过程顺畅?


屏幕快照 2016-09-05 上午10.26.53图 1


1)优化网络传输


卡是体育赛事直播的一大痛点。大家对图 1 应该都比较熟悉。观看网络直播时,经常会遇到图中旋转的图标,表示正在加载页面,这往往让人很揪心,特别是正好赶上体育赛事进攻的高潮。


那么,如何解决这个问题?当我们把体育赛事直播比喻为货运物流,网络传输则相当于马路。我们可以拓宽马路,或者采用优化调度策略。譬如,可以通过在某个位置建一座立交桥或者高架桥,又或者在某几个地方增减交通灯时长,来优化网络传输。


优化网络传输有两种方式:



  • BGP


在中国,网络运营商鱼龙混杂,它们之间最大的问题是南北互联问题。有人开玩笑说,最远的距离是,你是联通,我是电信。那么如何解决这个问题?


目前可行的方案是,利用 BGP 机房解决类似于南北互联、多运营商的问题。原理:同一个 IP 地址可以在不同运营商的请求到达时,向不同路由节点发送广播。即 IP 地址不变,使用电信网络访问时分配电信的网络环境,使用联通网络访问时分配联通的网络环境。相比其他双线机房,它的问题在于价格高昂,但是可以使用在核心节点上,以更好的解决南北互联问题。



  • DNS


智能 DNS 优化是另一个比较常见的解决方案。传统 CDN 用智能 DNS 解决用户的最后一公里问题,即访问一些边缘节点。在直播领域,通常会使用 HttpDNS,这主要是为了防止 DNS 污染给我们带来的一些问题。


2)视频流的大小和编码速度

货物大小和装货速度会影响直播的流畅度,那么该如何更好应对?在现实的原子世界中,传统的压缩方式是先将大货进行堆放,而后放入小货,它的压缩比可以预见并且有限。但是,在比特世界中,我们可以用其它方案消除它的冗余,其压缩比较原子世界有显著提高。



  • 视频压缩的原理


视频压缩的原理是消除冗余,如时间冗余、空间冗余、编码冗余等。接下来介绍两个常见的压缩方式:一是消除空间冗余,二是消除时间冗余,即帧内压缩和帧间压缩,这涉及到最基本的视频编解码原理。在视频编解码中有三种类型的帧,分别是 I 帧、B 帧、P 帧。I 帧是帧内编码,消除空间冗余,B 帧和 P 帧是帧间编码,消除时间冗余。原始视频可以理解为图片的连续播放,空间冗余在非常古老的视频压缩方法中就有体现,例如将每一帧的图片以 JPG 的形式进行压缩,由于原始数据非常大,它可以显著降低视频大小。


但我们发现,此时帧内压缩比太低,因此会采用帧间压缩的方式。即通过前面的帧和后面的帧计算关键帧的向量位移。比如,屏幕中有一只兔子,下一帧或者下几帧会向前跑,那么完整记录第一帧兔子的形态,第二帧位移的量即可,这就是 P 帧和 B 帧的概念,是基本视频压缩原理。



  • 编码器的选择


涉及到视频压缩不得不提的是编码器,它是用于压缩的技术手段。目前主流的编码器有:H.264 、 H.265 和 VP9,前两个是 MPEG 发布的两个标准,后者是谷歌的编码器。


那么哪个编码器更适合体育视频直播领域?


屏幕快照 2016-09-05 上午10.27.09图 2


图 2 的数据引自国外一篇著名论文。上方是码率的横向对比,码率最终反映视频大小,码率大小与视频大小成正比。图 2 表示客观情况下,视频质量一致时码率的大小,可以看到 H.265 非常强劲,它相当于 H.264 的 75.8%,VP9 的 48.3%,VP9 相比之下成绩较差。


讨论了货物的压缩大小和码率,我们还需要考虑装货时长。编解码时长可以形象的比喻为装货时长。图 2 显示,编同样一段视频,H.265 编码时长是 VP9 的 6 倍,VP9 是 H.264 的 40 倍,这是软编码情况下的数据,硬编码时效果会更好。因此,我们选择编码器时需要综合的考量。业界大多采用 H.264,而 H.265 是未来的方向。


3)协议选择


还有一个重要的概念是协议选择。网页的传输协议是 HTTP,直播领域有三个重要的业界标准,即 RTMP 、 HTTP-FLV 和 HLS,它们有什么区别?分别适合在哪些场景使用?谁又更适合体育直播场景?


屏幕快照 2016-09-05 上午10.27.20图 3


图 3 的对比数据中列举了几个主要指标。直播最关注的是延迟情况,HLS 延迟 10 秒左右,优化处理后可以减少到 7 秒。目前来说,RTMP 、 HTTP – FLV 延迟 1 到 3 秒。其实它们两个非常相似,都是 Adobe 的私有协议,所以在网页端,它们都需要 Flash Player 支持播放。很早以前,苹果表示不再支持 Flash player 播放器,因为在 Mac 上使用该播放器会存在耗电量大、发热比较严重等问题,后来安卓也不再支持该播放器,这导致安卓和 iOS 对 Flash 的支持度都非常差,因此 RTMP 、 HTTP-FLV 一般比较适合 App 直播。对于 HLS 而言, iOS3 、安卓 3.0 都支持直接在浏览器播放,因此其移动端浏览器支持度更好。


相比而言,RTMP 更适合现在社交的直播需求,因为社交类直播有较强的互动需求,土豪送主播礼物时,主播需要马上响应。而 HLS 更适合体育直播领域,因为互动性较低,对延迟要求不高,对跨平台性要求高,需要做到打开网页可以直接播放。



弱网优化



在宿舍看球是大家熟悉的场景,那么在宿舍、教育网、3G 场景中如何优化体育赛事直播?众所周知,上述三种场景的网络环境一般都较差,因此我们必须在延迟和卡顿之间作出取舍,而取舍标准是体育赛事直播更关注哪者。理想情况下,鱼和熊掌都想兼得,然而现实是残酷的。在网络环境相对差时,降低卡顿的办法是增加它缓存区的大小,但是延迟会变长,反之亦然。在交互较少的场景中,我们倾向于更流畅的体验。因此处于弱网环境时,可以相应增加缓冲区大小,虽然增加了延时,但是提高了对网络抖动的适应度。

1)动态调整码率减少卡顿


网络抖动严重时,我们该如何解决?为了达到稳定的码控,可以采用 CBR 方案。譬如,无论画面是高频或低频,推 1 M 体育赛事直播视频流时,都保证 1 M 码率,这样可以降低网络的要求,需要推的码率不需要有很大的波动。当主播端发现网络较差时,便可降低码率,进行动态调节。譬如,将原始的 1 M 码率降低 50 % 到 500 KB,达到优化推流效果,虽然画面有些模糊,但至少是流畅的。


2)适度丢帧


当处于极端情况,用户网络特别差,视频一直处于加载怎么办?此时,可以采取适度的丢帧。丢帧带给我们的常规体验是卡,但不顿,即屏幕中人一直跳着向前走,整个画面却没有停滞。用户处于极端弱网的环境时,会将这种体验归因于 2G 或者 3G 网络。


如果采取丢帧的措施,哪些可以丢?前面介绍过,帧分为 I 帧、B 帧、P 帧三类。在弱网环境中,可以适当丢掉一些 B 帧和 P 帧,留下 I 帧(关键帧)。假如想丢 I 帧,则需将相应的 B 帧和 P 帧全部丢掉,否则画面就会出现马赛克的效果。因此,将整个时间段的帧丢掉,或只丢 B 帧和 P 帧。另外,在播放端,解码分为解码前和解码后两个阶段,两个阶段各丢一部分帧,解码前丢一部分是为了在弱网的环境下优化播放体验,解码后丢一部分是为了解决影音不同步的问题。


3)追帧优化


在宿舍看球时,假如两个宿舍的人看的视频不同步则会很糟糕,一个宿舍的人欢呼起来,另外一个宿舍的人浑然不知缘由。所以要在不影响用户体验的情况下,降低整体延迟,采用追帧优化策略,即每隔一段时间,服务器的时间戳有很大延迟时,为了赶上服务器的进度,可以选择丢掉一帧,保证大家的步调相对一致。


4)最后的杀手锏


当前面提及的所有方案都不奏效,又该如何应对?最后一个杀手锏,即在极端情况下优先保证声音,不传图像。当出现这种状况时,观众都明白是自己的网络原因,而这样的方式可以保证观众至少可以从声音方式感受赛事,是没有办法的办法。