作者 | 阿里文娱无线开发专家 韦兴华

责编 | 屠敏

背景

作为优酷APP中用户使用频度最高、停留时间最长的窗口,播放器一直以来都承载着用户最直接的内容消费体验、产品创新、业务突破能力。随着长时间的功能迭代和业务累加,播放器架构在面对现有的体验优化和业务支撑上,越来越显得力不从心,亟需一次全面的架构升级。

经过多方权衡,最终确定基于Pipeline模式进行播放器的架构设计,达到易用、开放、可定制,同时具备清晰的结构、低功耗和良好稳定性的架构改造目标。

设计目标

结合问题的现状,改造的目标如下:

  1. 减少部分播放链条中的冗余逻辑,减少函数调用数,减少链路层次,提升起播速度;

  2. 统一内存、文件的多份存储,提升解码、渲染的复用度,可以降低播放器内存、线程等资源消耗,提升稳定性;

  3. 将播放源、数据下载、后处理等模块的实现开放化和可定制化,让业务可以根据需求自行在播放链路中插入和实现功能逻辑,实现业务的定制化能力;

  4. 从整体播放中心的角度思考,优化架构,以便支撑可预见的多源、多流的业务需求,快速扩展,及时响应业务;

  5. 实现下载器、解码器、渲染引擎、PCDN、Netcache、智能档等功能模块的原子化,降低模块间的耦合,方便对外输出,并逐步实现单测覆盖。

面临的问题

如下图,通过分析现有的结构,比较容易看出目前存在的问题:

  1. 层次过多,一些功能和状态代码散落在不同的层次中,导致可维护性不够。

  2. 核心播放逻辑和业务定制逻辑耦合较重,导致对外支撑和向二、三方开放时接口易用性不够,可配置化能力不足。

  3. 开放性和扩展性不足,对于需要深度定制的接入方,没有快速的方式对下载、后处理等流程进行干预,对于合流、切流、混帧等特异化处理也没有统一的开放能力透出。

方案设计

1、整体设计

通过梳理,一个播放流程可以抽象为“播放源请求”、“流数据下载”、“流解码”、“后处理和渲染”几个主要的过程,以及“数据埋点中心”“配置中心”等配套设施。在整体架构上,将原来多个层次的实现合并到一个统一的播放框架中,将播放能力和基础业务原子化插件化,由播放框架统一管理并提供可配置化能力。

在开放和扩展性的支持上,将以上的几个主要流程抽象成“播放源管理器”、“数据下载器”、“渲染器”并提供统一的定制化开发能力,并提供自适应的解码能力,以满足未来业务创新上对合流、切流、混帧和后处理的特异化开发需求。

2、统一播放框架

播放框架层负责统一管理和串联各个模块,同时对外部提供统一的API接口。如图所示,1)接口层提供基础的播放上下行消息、管线注册、模块配置等接口;2)状态管理、上下文管理、时间轴管理和多实例管理模块,可以支持多Period和多Source的播放序列,以方便业务方能够快速实现可变格式播放源合并、切流等业务;3)实例池模块可以结合设备和可用资源自适应的管理解码器实例,保证稳定性和体验的平衡;4)管线管理模块负责管线注册和管线绑定逻辑;5)插件管理模块支持一些定制能力的内部实现,内置一些优酷业务能力并支持可配置能力。

3、播放源管理

播放源管理模块抽象了一个PlayList结构,用于支持业务方能够方便的实现不同格式和编码方式的播放源合并、播放序列管理、切流等业务。主要结构如下图,其中PlayList是一个总播放序列;其下的每个Period节点表示一个统一的时间轴播放序列,其下的所有source会合并成一个时间轴,比如由4个15秒的视频合并成的一组60s贴片广告;每个Period下可以挂载多个source,这些source可以支持相同或者不同格式、不同编码参数的视频组合。在播放过程中,允许动态的切换当前Peroid,或者修改后续Peroid的顺序。

4、缓存管线

缓存处理采用多级管线的处理,业务方可以根据自己的场景通过缓存中间件和缓存过滤器的定制实现,来满足针对性的数据下载优化。在优酷播放场景中,针对网络请求和本地存储实现了NetCache和PCDN两个缓存过滤器,具体如下图所示:

1)将资源存储分为三级缓存管理,由缓存管线进行调度管理;

2)业务可以通过参数自定义选择使用混合层级的缓存;

3)缓存管线针对不同资源,读取或写入存储时分别通过访问 NetCache 或 PCDN 模块进行处理;

4)未来本地磁盘存储除预览需求外,希望统一采用 PCDN 存储方式存储,以提升 PCDN 的分享率,有效的降低成本。

5、渲染管线

后处理和渲染同样采用多级管线的处理。渲染管线模块提供多个渲染Context支持,每个Context绑定一个解码器和一个渲染窗口,并自动对同一个渲染窗口的多个Context的渲染结果进行合并和上屏。业务方可以通过实现渲染中间件和渲染过滤器来进行定制化的开发,以进行诸如混流、混帧、视频特效等特异化开发来满足业务和创新需求。

思考和总结

播放器以及端侧播放链路是一个庞大而复杂、且综合性很强的系统,尤其在优酷这样的重视频场景消费的产品中,播放器承载的业务会随着时间不断增长。如果没有一个相对合理稳定的架构设计,在长时间迭代之后整个系统的复杂度是不可想象的。在本次架构改造中,我们首先抽取播放的核心过程作为整个架构的基础,把播放中心已经积累的能力模块化原子化,通过统一的播放框架组织起来,同时结合未来业务的创新和发展方向,对外开放了统一的定制化开发能力,基本实现了预期的改造目标。

当然播放框架的改造并不是一蹴而就的,未来在核心框架稳定的前提下,还需要继续推进诸如端侧数据中心、端侧AI、全链路监控等配套基础设施的建设。同时随着5G技术的发展,如何将端侧和边缘结点打通,如何在端、边、云上做到计算资源的最大化利用,也是播放框架需要思考和尝试的方向。

【End】

推荐阅读 

☞75.58 亿美元成交!美国最大规模 5G 毫米波频谱拍卖

☞不用掉一根头发!用 Flutter + Dart 快速构建一款绝美移动 App

☞超轻量级中文OCR,支持竖排文字识别、ncnn推理,总模型仅17M

☞和黑客斗争的 6 天!

☞一文了解 Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控!

☞用 3 个“鸽子”,告诉你闪电网络是怎样改变加密消息传递方式的!

你点的每一个在看,我认真当成了喜欢

优酷基于 Pipeline 的播放器开放式架构设计与实践相关推荐

  1. 优酷 YouTube Twitter及JustinTV视频网站架构设计笔记

    本文是整理的关于优酷.YouTube.Twitter及JustinTV几个视频网站的架构或笔记,对于不管是视频网站.门户网站或者其它的网站,在架构上都有一定的参考意义,毕竟成功者的背后总有值得学习的地 ...

  2. android 音乐播放器设计,基于Android音乐播放器设计的实现毕业论文.pdf

    摘要 随着手机的智能化以及网络的普及和应用,人类将进入移动互联 网的新时代.在国内,随着4G牌照的下发,三大运行商也在加紧抢 占移动互联网领域的制高点.在此过程中,人们对新一代移动互联终 端设备的功能 ...

  3. 安卓实训项目:基于储存卡音乐播放器实训报告5.0

    安卓实训项目:基于储存卡音乐播放器实训报告5.0 (一)功能要求 在基于存储卡音乐播放器V0.4基础上,作如下修改: 1.创建应用程序常量接口保存广播频道常量 2.在音乐播放器应用程序类里添加两个属性 ...

  4. 安卓实训项目:基于储存卡音乐播放器实训报告4.0

    功能要求 在基于存储卡音乐播放器V0.3基础上,作如下修改: 1.创建方法能扫描存储卡上所有mp3文件(采用递归算法) ----完成 2.用自定义应用程序类存放全局数据和方法 ----完成 3.利用异 ...

  5. 安卓第一阶段实训项目:基于存储卡音乐播放器(更新中……)

    文章目录 一.项目功能要求 二.涉及知识点 三.实现思路 1.基于存储卡音乐播放器V0.1 2.基于存储卡音乐播放器V0.2 3.基于存储卡音乐播放器V0.3 4.基于存储卡音乐播放器V0.4 5.基 ...

  6. 一个简单的基于 DirectShow 的播放器 2(对话框类)

    上篇文章分析了一个封装DirectShow各种接口的封装类(CDXGraph):一个简单的基于 DirectShow 的播放器  1(封装类) 本文继续上篇文章,分析一下调用这个封装类(CDXGrap ...

  7. 一个简单的基于 DirectShow 的播放器 1(封装类)

    DirectShow最主要的功能就是播放视频,在这里介绍一个简单的基于DirectShow的播放器的例子,是用MFC做的,今后有机会可以基于该播放器开发更复杂的播放器软件. 注:该例子取自于<D ...

  8. 基于android音乐播放器的设计

    本科毕业论文(设计)诚信声明 本人郑重声明:所呈交的毕业论文(设计),题目<---基于android音乐播放器的设计----------->是本人在指导教师的指导下,进行研究工作所取得的成 ...

  9. 基于IjkMediaPlayer的播放器

    作为一个练手项目,基于IjkMediaPlayer的仿照腾讯视频风格的播放器,支持全屏缩放,对其中核心的代码做记录. 播放器总体架构如图所示: player是继承frameLayout,自己内部拥有I ...

最新文章

  1. 2018 区块链技术及应用峰会(BTA)·中国全日程新鲜出炉,更多精彩议题看不停
  2. live的domain服务
  3. python进行数据查询_如何进行python数据库查询?(实例解析)
  4. mastercam后处理升级_Mastercam中文版后处理MPFan 有了它就可以自己修改后处理了 呵呵...
  5. mediamind SyncAds
  6. ajax中GET和POST区别
  7. ROS激光SLAM导航理解
  8. 百度一键Root授权管理完美卸载解决方案
  9. 走出“胡同”后,智能家居如何驶上高速路?
  10. java异常处理(Exception handing)机制
  11. Android recycleView滑动与bottomsheet 冲突解决
  12. 杂谈:一张图片引发的版权问题
  13. 如何写出三体的MATLAB程序-代码篇
  14. oracle数据库 cmd,cmd命令操作Oracle数据库
  15. 【PHPWord】基于Word模板替换生成输出表格动态生成内容、合并单元格、设置单元格背景颜色
  16. 期货程序化反向跟单·序章
  17. 【Linux】主机字节序和网络字节序
  18. java 鱼刺图_鱼骨图问题分析法
  19. 牛客网140道编程题源代码(1—50)
  20. cocos2dx实现单机版三国杀(一)

热门文章

  1. c#划分目录和文件(小白的一点经验)
  2. 使用ajax的时候必须要加的几行代码
  3. java se 7u67_Java SE 7u72和Java SE 7u71有什么不同
  4. PAT乙级 1029 旧键盘 (20 分)
  5. opencv有基于c语言的教程吗_VS2019配置opencv详细图文教程和测试代码的实现
  6. 在excel工作表中c1单元格_Excel工作表中的11个逻辑函数应用技巧,中文解读,动图演示!...
  7. 静态成员函数与静态数据的使用
  8. queue,stack中的库函数
  9. 凝胶成像文件行业调研报告 - 市场现状分析与发展前景预测
  10. 军事卫星行业调研报告 - 市场现状分析与发展前景预测