免费下载!由 O’Reilly 出版的《NGINX 完全指南》中文版已正式上线 了解详情
写点什么

爱奇艺知识的音视频通用播放架构实践

  • 2020-04-20
  • 本文字数:3141 字

    阅读完需:约 10 分钟

爱奇艺知识的音视频通用播放架构实践

导读

随着经济的发展“衣食住行”等基础消费已不再是消费者首要考量,自我认知的提高便成为现阶段消费的必然选择。尤其是在移动互联网崛起的当下,移动支付和不限流业务的普及,人们为他们感兴趣的内容或知识买单的行为逐渐养成,为知识服务平台商业价值打下基础。


早期的知识服务类平台大多以音频形式为主,因播放形式比较单一,对架构技术场景的要求也较为简单,随着内容消费的升级,知识服务平台的展现形式更加丰富,视频类消费逐渐成为行业共识,为了满足用户的多种需求,早期音频起家的知识服务类平台开始陆续切入视频,这样的音频、视频混杂的多场景的播放体验及场景间的平滑切换逐渐成为了行业内面临的技术挑战。


爱奇艺知识技术团队较早就开始针对兼顾音视频播放架构进行思考、通过实践开发出一套音视频播放的通用架构,支持更丰富的音视频场景体验,有效解决了行业内面临的技术挑战,本文将分享爱奇艺知识音视频通用播放架构的实践。

爱奇艺知识播放业务产品形态




从上面产品形态效果图可以看出,爱奇艺知识播放器支持视频窗口、音频窗口、视频浮窗、音频浮窗、短视频窗口、短视频浮窗、音频控制台等多种场景播放,并且可以根据需要在保持播放的平滑流畅的同时随时切换。


上述多场景播放的产品形态在技术实现上的最大挑战是是多个播放场景的平滑切换,也就是说在播放一个内容时很难在不影响播放器的状态的情况下音视频场景随意切换,这就面临着无法保证用户的持续流畅的视听体验的问题。爱奇艺知识技术团队开发了一套通用播放架构,其支持以下特性:


1)支持多种音视频融合场景,以及新的音视频场景快速接入;


2)场景之间的切换不会引起播放器状态的变化,即播放器的播放状态对场景的切换无感知。

音视频通用播放架构

为了支持多场景融合以及播放器对场景的无感知切换,这套通用播放架构要具备以下特点:


1)播放器与播放业务解耦: 支持更多的播放场景、以及新的播放业务快速接入,并且不影响其他播放业务;


2)播放器与播放 SDK 解耦: 支持第三方内容和 SDK 接入: 提供强大内容拓展性,保证接入第三方内容现有的播放业务不需要调整;


3)播放器与分发页面解耦: 播放器存在于 App 全局,可以出现在任何展示页面,不影响用户浏览。



架构的介绍:


  1. 基础播放 SDK:提供基础的播放功能,对外输出音视频效果;

  2. 统一播放器:屏蔽底层播放 SDK 差异,根据协议为上层提供统一的播放能力接口;

  3. 播放业务管理器 : 负责播放业务的调度、解除播放业务与播放器的耦合;

  4. 播放场景业务:负责向用户展示音视频播放能力和交互的业务;

  5. 播放关联业务: 为播放器提供增值或支撑的业务。

3.1 播放器与播放业务的解耦

3.1.1 播放器与播放业务耦合的弊端

从爱奇艺知识播放器的产品形态可以看到,播放器可支持多种场景下的播放,一个内容的周期内必须使用同一个播放器,这样就会带来一个问题,一个播放业务播放器状态发生变化,其他播放业务必须同步更新播放状态,各个播放业务之间互相交叉,随着播放业务的增多,开发和维护成本会急剧增加, 导致后续开发不可持续。

3.1.2 播放器与播放业务的解耦方案

播放状态变化是导致不同播放业务场景之间交叉同步的原因,新的解耦方案需要解除播放业务对播放器的直接操控,采用观察者模式对播放业务和播放器进行解耦,设计思路如下:


1、播放业务管理器


1)作为被观察者为各个播放业务分发播放器的状态变化;


2)为各个播放业务提供基础的播放操控和数据访问接口。


2、播放业务


1)作为观察者接收播放器的状态变化,更新关联的播放状态和数据;


2)接收用户操作,通过播放业务管理器对播放器进行操控。



目前爱奇艺知识播放业务都是以模块的形式注入到播放器业务管理器,业务模块只负责观察调用播放业务管理器。不直接持有播放器实例。解除了播放业务与播放器的耦合。

3.2 播放器与播放 sdk 解耦

爱奇艺知识除了涵盖爱奇艺自身生产的内容外,也会接入“喜马拉雅”、“蜻蜓 FM”等第三方合作方的内容。由于每家合作方播放 SDK 提供的 API 都不一样,如果业务层对每个合作方都进行业务开发,就会导致业务量非常庞大,并且不同合作的方的播放 SDK 会产生交叉,不利于播放业务的维护和拓展。同时开发量指数增长,无法满足第三方合作快速上线的需求。


为了避免业务层单独适配第三放播放 SDK,需要对业务层和第三方播放 SDK 进行解耦操作。即上层业务对接入第三方合作方的播放 SDK 是无感知的。解耦方案设计如下:


1)设计统一播放协议,对于上层播放业务,只调用按照统一协议设计接口,不必关心底层播放器的设计逻辑。保证上层播放业务不随新的接入播放 SDK 发生变化。


2)爱奇艺播放 SDK 和第三方播放 SDK 按照统一协议进行适配,提供基本的播放接口。保证上层业务对具体播放 SDK 无感知。

3.2.1 解耦设计实现:


在解耦设计实现中,播放 SDK 适配器实现的核心:


1)对于上层业务,播放 SDK 适配器对上层业务输出标准的播放、暂停、快进等接口;


2)对于底层基础 SDK,播放 SDK 适配器负责分发具体播放 SDK,并适配其播放、暂停、快进等接口。


由于播放器和播放 SDK 实现解耦,爱奇艺知识 App 在不改变上层业务的情况下集成了喜马拉雅和蜻蜓第三方音频内容。避免了上层业务修改带来的工作量,大大加快的第三方内容的接入速度。

3.3 播放器与分发页面解耦

目前市面上很多视频应用退出详情页,视频播放就会被终止,这样就不能为用户提供持续平滑的播放体验。为了打造极致播放体验,爱奇艺知识 App 支持不同页面间切换时播放器持续平滑播放。

3.3.1 播放器持续平滑播放方案选择

播放器持续平滑方案主要涉及三种:


1)画中画方案:虽然 Android8.0 及其以上版本已提供了画中画方案,但是 Android8.0 以下版本仍然保有大量用户,其缺点就是无法满足 Android8.0 以下用户需;


2)采用系统浮层:采用系统浮层需要系统浮层权限,Android 厂商对系统浮层的授权越来越严格,导致用户授权过程的体验比较差;


3)在每个展示页面单独添加播放器浮窗:优点是不受 Android 系统版本限制,并且用户无需系统浮层权限授权,适合所有手机用户,体验较好。


为了更好支持用户体验,我们选用了第三种方案。

3.3.2 展示页面单独添加播放器浮窗的弊端

展示页面单独添加播放器浮层方案虽然对用户比较友好,但是开发成本较高,每个页面都有可能中承载播放器并与播放器生命周期联动,播放器与每个页面耦合,开发成本和页面数量成正比。不利于后期维护。因此我们在此思路的基础上做了解耦设计和架构改造。

3.3.3 播放器与展示页面解耦设计:

采用非侵入式方案,设计思想如下:


  1. 通过底层劫持展示页面的生命周期处理,处理播放器生命周期, 解除播放器与展示页面的生命周期耦合。

  2. 设计透明容器作为音视频浮窗的容器,展示页面可见时将透明容器嵌入到展示页面的根布局容器中,实现短视频浮窗展示页面的解耦。


非侵入式页面切换方案调度图如下所示:



从调度图可以看出,播放器页面间切换和生命周期的控制逻辑由“生命周期劫持模块”负责,与展示页面解耦。


目前爱奇艺知识 App,新增加的页面不需要添视频条容器即可实现视频条的展示,新页面的开发者不需要关注视频条逻辑,降低了开发工作量。

总结与展望

爱奇艺知识为用户打造极致的音视频播放体验出发,自主研发设计了一套通用的音视频播放架构,能够有效的支持多种场景播放需求,可实现第三方内容的快速接入,极大提升了用户体验。提升播放器性能并支持更多的播放场景是播放器开发者一直面对的问题。爱奇艺知识技术团队通过不断的技术创新,赋予用户更优质的播放能力和体验。


作者介绍


本文转载自公众号爱奇艺技术产品团队(ID:iQIYI-TP)。


原文链接


https://mp.weixin.qq.com/s?__biz=MzI0MjczMjM2NA==&mid=2247486671&idx=1&sn=78bb2087b673a00c600da9b7bd1e6e43&chksm=e97690ecde0119fa9c65dfaf95d713931b78cb26463edb12659f8c80ceeca836d1be6090aa68&scene=27#wechat_redirect


2020-04-20 10:002299

评论

发布
暂无评论
发现更多内容

并发王者课-黄金2:行稳致远-如何让你的线程免于死锁

MetaThoughts

Java 多线程 并发

模块六作业 - 拆分电商系统为微服务

张大彪

JAVA设计模式系列--单例模式

加百利

Java 后端 设计模式 单例模式 6月日更

架构师实战营 模块六作业(拆分电商系统为微服务)

代廉洁

架构实战营

架构实战营-模块一作业

rubys_

架构实战营

HTTP 长连接和短连接

看山

TCP/IP HTTP协议 6月日更

Java语言概述以及环境搭建

若尘

java编程 6月日更

五种服务部署升级策略,你也许会用的到

架构精进之路

6月日更 服务升级

Git 各指令的本质,真是通俗易懂啊

xcbeyond

6月日更

架构实战营-作业六

大可

TempDB 的使用和性能问题

悟空聊架构

sql 性能调优 6月日更 TempDB

Python——数值列表

在即

6月日更

Scrum Patterns : MetaScrum(译)

Bruce Talk

敏捷开发 译文 Agile Scrum Patterns

Single-Spa构建第一个微前端项目

devpoint

Vue 大前端 6月日更

HarmonyOS的万里长征和万里长城

脑极体

【LeetCode】第一个错误的版本Java题解

Albert

算法 LeetCode 6月日更

nacos配置中心模块详解

捉虫大师

nacos 配置中心

SpringCloud Gateway 路由数量对性能的影响研究

黄仲辉

性能优化 动态路由 SpringCloud Gateway JMH性能基准测试

未来,能源枯竭可以逆转吗?

白洞计划

未来,能源枯竭可以逆转吗?

脑极体

中国数字化转型为全球带来机遇

CECBC

【音视频】基于声网的多人视频通话功能建设

轻口味

android 音视频 IM 声网

网络攻防学习笔记 Day43

穿过生命散发芬芳

网络攻防 6月日更

【Flutter 专题】105 图解自定义 ACEPageMenu 滑动菜单 (一)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 6月日更

架构师实战营 模块六总结

代廉洁

【通俗易懂】虚拟DOM,如何更高效DIFF

蛋先生DX

Diff 6月日更

话题讨论|如何看待腾讯试点强制6点下班

石云升

话题讨论 加班文化 6月日更

策略模式怎么玩?

卢卡多多

设计模式 策略模式 6月日更

SpringCloud Gateway 路由转发性能优化

黄仲辉

性能优化 动态路由 SpringCloud Gateway JMH性能基准测试

架构实战营 - 模块 6- 作业

请弄脏我的身体

架构实战营

MySQL基础之十一:创建表

打工人!

MySQL 6月日更

爱奇艺知识的音视频通用播放架构实践_移动_爱奇艺技术产品团队_InfoQ精选文章