一、概述 目前,移动视频直播正处于一个高速膨胀的时期。游戏直播,秀场直播等 APP 铺天盖地。如何在千军万马中脱颖而出,直播的实时性和流畅性是重中之重。 直播的实时性对于用户体验非常重要,主要体现在两个方面:秒开和延时。秒开是指用户点击播放到看到画面的时间非常短,在 1 秒之内;延时是指播放端的画面和主播端的画面的时间差,时间差越小,实时性越好,体验越佳。 保证直播的流畅性是指在直播过程中保证播放不发生卡顿,卡顿是指在播放过程中声音和画面出现停滞,非常影响用户体验。造成卡顿的原因有几种情况:(1)推流端网络抖动导致数据无法发送到服务器,造成播放端卡顿; (2)播放端网络抖动导致数据累积在服务器上拉不下来,造成播放卡顿。 由于从服务器到播放器的网络情况复杂,尤其是在 3G 和带宽较差的 WIFI 环境下,抖动和延迟经常发生,导致播放不流畅,播放不流畅带来的负面影响就是延时增大。如何在网络抖动的情况下保证播放的流畅性和实时性是保障直播性能的难点。针对上述提到的问题,下面会一一讨论。 二、播放器秒开 目前市面上有些 APP 点击播放后画面出现非常快,有些则需要等较长的时 间。画面出现的越快,体验越好。那么怎样才能做到呢? 图 1 所示为一个简单的直播流程,推流端将音视频数据推送到服务器端,播放端从服务器端拉取音视频数据进行播放。秒开主要可以从以下两个方面进行优化: ( 1 )优化服务器策略 播放器接入服务器请求数据的时间点的视频帧不一定是关键帧,那么需要等到下一个关键帧的到来,如果关键帧的周期是 2s 的话,那么等待的时间可能会在 0~2s 的范围内,这段等待的时间会影响首屏的加载时间。如果服务器有缓存,则播放端在接入的时候,服务器可以向前找最近的关键帧发给播放端,这样就可以省去等待的时间,可以大大的减少首屏的加载时间。 ( 2 )优化播放端策略 播放端请求到的第一帧数据肯定是关键帧,关键帧能够通过帧内参考进行解 码。这样播放端就可以在接收到第一个关键帧的时候就立即开始解码显示,而不需要等到缓存一定数量的视频帧才开始解码,这样也能减少首屏画面显示的时间。 [IMG]http://image18.poco.cn/mypoco/myphoto/20161018/18/56516772201610181837123833336423248_000.jpg[/IMG] 图 1 直播流程 三、流畅度优化 由上文可知,视频在播放的过程中不发生卡顿,则流畅度越好,体验越佳。 目前主流的直播协议是 RTMP 、 HTTP-FLV 和 HLS ,都是基于 TCP 的长连接。在播放的过程中,若播放端所处的网络环境在一个较佳的状态,此时播放会很流畅。若网络环境不是很稳定,经常会发生抖动,如果播放端没有做特殊处理,可能会经常发生卡顿,严重的甚至会出现黑屏。而移动直播由于其便捷性,用户可以随时随地发起和观看直播,我们无法保证用户的网络一直处于一个非常好的状态,所以,在网络不稳定的情况下保证播放的流畅度是非常重要的。 为了解决这个问题,首先播放器需要将拉流线程和解码线程分开,并建立一个缓冲队列用于缓冲音视频数据。拉流线程将从服务器上获取到的音视频流放入队列,解码线程从队列中获取音视频数据进行解码播放,队列的长度可以调整。当网络发生抖动时,播放器无法从服务器上获取到数据或获取数据的速度较慢,此时队列中缓存的数据可以起到一个过渡的作用,让用户感觉不到网络发生了抖动。 当然这是对于网络发生抖动的情况所采取的策略,如果播放端的网络迟迟不能恢复或者服务器的边缘结点出现宕机,则需要应用层进行重连或调度。