美文网首页
腾讯研发总监王辉:十亿级视频播放技术优化揭秘 读后笔记

腾讯研发总监王辉:十亿级视频播放技术优化揭秘 读后笔记

作者: 肖金光xjg | 来源:发表于2017-08-01 13:43 被阅读104次

    原文:腾讯研发总监王辉:十亿级视频播放技术优化揭秘

    agenda: 快速上线 --> 成本优化 --> 体验优化

    我的分享主要是按照我们产品迭代的几个关键步骤展开:
    首先是快速上线,2015 年我也是跟随着大家的体验快速上线了新短视频的体验;
    其次面临的是成本问题,在做的过程中做了一些成本的优化工作;
    然后是体验优化。在解决成本问题之后,短视频的观看体验要做到极致。比如说视频的秒开、不产生缓冲、不卡、成功率的提升。

    1 基本的播放需求

    基本的技术要点
    边下边播,加速播放速度
    流量控制,具备元控制能力,让带宽消耗可控
    与业务合理解耦
    模块化复用,统一播放逻辑,跨平台
    监控上报,多维度监控,对业务知根知底

    可以看到,完成核心技术要点最核心的一点是如何控制视频的下载,传统的方式是播放器直接塞播放地址给播放器,它就可以直接播放,这其实是一个黑盒。
    我们在中间加了一个本地代理,播放器与服务器的数据请求,我们完全可以把控。在这个过程中,比如说播放器要数据时,可以给它更多的数据,这样能解决它缓冲的问题。有了这层代理之后,架构也更清晰一点。

    基于 MVC 架构,在 MODEL 一层做一些业务的逻辑,在 VideoController 这一层做控制视频的播放和下载。
    有了下载代理之后,就可以通过代理管理下载,在 APP 里面有很多的视频请求,VideoProxy 可以管理这些请求,做流量控制,做预加载,还可以做优先级调度和做监控上报,下载逻辑层则主要关注怎么优化服务器,对接缓存管理层,同时我们抽象出了一个数据层,我的数据源可以是 HTTPDataSource,也可以读本地,也可以是来来自腾讯视频的数据源,也可以是第三方 APP 的数据源,协议层主要是 HTTP、HTTPS、HTTP2 的解决。
    在 VideoController 的逻辑里,其实都可以放到 C 层来实现,这样安卓和 iOS 完全可以通用,这一层的逻辑可以在 QQ 和 QQ 空间两个 APP 里面使用,相当于是我们一套逻辑可以完全复用,不用再开发四套逻辑。

    监控目的:
    问题定位
    耗时统计
    成功率统计
    实时告警

    监控上报,肯定是不可缺少的,这是一个成熟的项目必备的要素:

    1. 问题定位,老板跟用户反馈说我这个视频播不了,要有一套成熟的问题定位的方式;
    2. 耗时统计,用户播放这个视频花多长时间播出来,这也是要了解到的;
    3. 成功率统计,外网用户播放视频的成功率是多少?还要通过实时报警,才能及时知道外网发生一些故障。
    定位问题
        错误归纳
        上报流水
        错误统计
    实时统计
        播放成功率
        下载成功率
        缓存耗时
        缓存概率
        播放次数
    实时告警
    

    传统的捞 Log 方式大家都有,但是这种方式效率太低,需要等用户上线之后才能捞到 Log,Log 捞到之后还得花时间去分析。我们做法的是在关键问题上做一些插装,把每一类错误和每一个具体的子错误都能定义出来,这样一看错误码就知道播放错误是由什么原因导致的。

    还可以把每次播放视频的链路所有关键流水上报到统计系统里来,每一次播放都是一组流水,每一条流水里面就包含了例如首次缓冲发生的 Seek,或下载的链接是多少,下载的时间是多少,有了这些流水之后,用户反馈播放失败,我首先可以用流水看发生了什么错误?错误在哪一步?每一步信息是什么?几秒钟就可以定位到问题。

    有了这个数据上报之后,还可以做一些报表。比如说可以做错误码的报表,有了报表之后就可以跟进哪个错误是在 TOP 的,负责人是谁,原因是什么,都可以看到。

    3 成本优化

    如果之前不做限速的话,一点开视频就疯狂地下数据,带宽有多大就下多少的数据,这样浪费很严重。我们采取的第一个策略是进行流量控制。在高峰期播放到第 10 秒时,预下载 N 秒数据,下载到 N 秒就停下来。然后,可以做多级限速。一开始不限速,下载到合适时机做 1 倍码率限速。高峰期时预加载的数据会少一些,防止高峰期时带宽占用明显,这是初级的策略。最终我们也有码率切换的策略。这对用户的观看体验影响比较大,这也是之前必备的一个策略。

    流量控制
    H265
        客户端适配
        客户端解码适配
        客户端解码覆盖
        H256编码后端策略
        H256编码后端优化
        自严H256编码器
    

    4 体验优化

    核心的流程主要是三个步骤:
    客户端初始化播放器;
    下载数据;
    等待播放。

    这里主要有两个大的耗时点,第一下载视频数据耗时;第二个是客户端的耗时,下载视频数据耗时的话,主要是下载数据量和下载的速度。
    这里有一个很直接的问题,播放器需要下载多少数据才能播放?

    优化点:

    1. mp4的MOOV问题,保证都在文件首部
    2. 播放器行为优化(Mdata优化)
    3. 优化下载耗时
      防盗链耗时
      IP直出与竞速
    4. 预加载:预加载时机
    5. 客户端性能优化
      线程梳理
      异步化
      重复运算做缓存
      hls优化
      串行下载改并行下载

    缓存优化
    正常情况(10%)
    带宽调整(暂停其他占用下载带宽的逻辑)
    低速切换IP
    网络抖动(单次下载出现两次抖动,就突破下载限制)
    Seek场景(90%)
    缓存系统重构,支持文件空洞
    存储做一次重构,支持文件空洞

    成功率优化
    成功率优化,也是比较关键的指标。成功率优化没有捷径,可能是 Case by Case 各个击破。
    针对错误进行编码,有几百个错误码,每一个错误码捞 log 去看,错误码原因进行上报,每次进行循环一个个错误码进行解决
    下载常用错误
    DNS劫持 35%
    异常返回403 25%
    异常返回404 10%
    慢速网络 10%
    网络不稳定 10%
    异常返回500 5%
    内容遭劫持 5%
    播放常用错误
    视频播放器内部错误 35%
    播放器调度不合理导致的错误 65%
    播放器成功率解决
    逻辑上的问题,因为播放器是有状态机的,开发人员比较多,每个人过来加一个逻辑的话,会导致播放状态出现问题。
    解决播放器错误的方法:
    HOOK 播放器接口与回调,实现播放器状态机,监控插放器 API 的调用是否合法,不合法直接告警或 Crash。
    帮助开发快速定位问题,同时减轻测试同事的负担,封装成 UI 组件,使其它开发不必理解播放器。

    相关文章

      网友评论

          本文标题:腾讯研发总监王辉:十亿级视频播放技术优化揭秘 读后笔记

          本文链接:https://www.haomeiwen.com/subject/gusjlxtx.html