MX Player在线播放优化

杨志
• 阅读 942

所有在线内容播放,都面临一些共同的问题:启播慢,seek慢,码率切换慢。而随着互联网的发展,用户对这些方面的要求越来越高,对慢的容忍度越来越差,如何解决这些问题,就成了MXPlayer 在线业务初期优化的重点。

本次分享将分为四个部分:第一部分介绍MXPlayer 如何解决起播慢,seek慢;第二部分介绍如何解决码率切换慢的问题;第三部分介绍缓存面临的问题,以及缓存是如何为前两部分服务的;最后一个部分介绍在复杂业务下,多播放器实例是如何管理的,通过以上几个部分为大家介绍MXPlayer 对在线内容播放优化的经验。

文/赵琳琳

整理/LiveVideoStack

大家好,我是赵琳琳,来自MX Player。我的分享主题是:MX Player在线播放优化。

MX Player在线播放优化

首先简单介绍一下业务背景:MX Player起初是一款比较纯粹的本地播放器,其体积小,但功能强大,在全球各个地区都有不少的活跃用户。随着时间推移,公司在产品策略上也进行升级,引入了在线化的内容如影视剧、短视频、直播等。

虽然全球都有MX Player的用户,但其中主要用户来自于印度地区。印度地区的用户比较有特色,第一是语言(有十几种主流语言);第二是网络(4G网络占多数,家庭有线宽带较少);第三是设备(偏低端机型,存储空间小)。

MX Player在线播放优化

随着在线内容的引入,也出现了一些问题。例如启播慢、seek慢、码率切换慢、缓存命中率低、代码复杂度高等。

MX Player在线播放优化

今天的分享内容主要围绕以上的问题展开,首先介绍秒开、快速seek是如何实现的;之后是平滑码率切换的技术细节;然后是缓存面临的挑战;最后是多播放器事例是如何管理的。

-01-

秒开

MX Player在线播放优化

第一部分,秒开。如何让用户尽可能快地看到视频内容,是所有在线播放面临的难题。有数据表明,等待时间越长,用户流失越严重。

MX Player在线播放优化

根据统计,热度视频平均启播时长在2.5秒左右。

MX Player在线播放优化

经过进一步的分析,发现其中绝大多数时间用于下载数据。

MX Player在线播放优化

那么如何减少用户的等待时间呢?我们分析了几个优化方向,首先解码占用时间是较少的,优化空间有限;启播缓冲区大概需要2秒等待时间,我们认为这个时间已经很短了,所以不选择减小以优化;最终我们经过分析对比选择了预加载方案。

MX Player在线播放优化

预加载的流程是:首先服务端根据一些策略判定哪些视频需要预加载,并且把信息告诉客户端。客户端收到请求后,会启动预加载程序。预加载程序会在视频没有播放的情况下启动预加载,把需要加载的视频头2秒放到缓存内。

MX Player在线播放优化

策略上线后,热度视频的平均启播时长由2.5秒降到1.8秒。如果预加载的缓存命中,启播时长可以达到0.5秒,收益非常可观。

MX Player在线播放优化

那么如何决策哪些视频需要预加载?服务端会根据视频的标签(新剧/推广/热度)等进行打分,最终做出决策并告知客户端,启动预加载程序。

-02-

快速seek

MX Player在线播放优化

接下来介绍快速seek。和启播一样,等待时间越长,用户流失越严重。

MX Player在线播放优化

我们先看一下优化之前的seek过程。假设用户要seek到A点,播放器首先会进入暂停状态,并缓冲接下来6秒的数据,完成之后开始播放。

MX Player在线播放优化

经过分析,发现用户seek平均等待时间是3.4秒

MX Player在线播放优化

那如何减少seek时间呢?

前文有提到预加载方案,是否适用于seek呢?答案是No,因为并不知道用户要seek到什么位置,除非缓存整个视频,显然这是不合适的。

另外一个方案是减小缓冲区,例如从6秒调整到4秒或更短。但这种方法比较简单粗暴,无法预知其是否有负面的用户体验影响,所以这个方案也被否定。

MX Player在线播放优化

那么如何解决呢?经过分析和观察,我们发现当播放器当前的下载速度大于播放速度,不论缓冲区有多少数据,播放都是流畅的。

MX Player在线播放优化

根据以上结论,我们得出一个快速seek方案:用户seek到A点,播放器暂停并缓冲1秒,得出当前下载速度D和常量播放速度P,如果D>=P,则直接开始播放;如果D<P,就会执行缓冲6秒数据再开始播放。

MX Player在线播放优化

策略上线后,数据统计分析显示平均等待时长由原先的3.4秒降为2.5秒。

-03-

平滑码率切换

MX Player在线播放优化

接下来讲平滑码率切换,首先看一下优化前的流程。

箭头所指为当前播放器进度,蓝色为已缓冲内容。如果开始切换,播放器会暂停,并丢弃当前的缓冲区,接着缓冲对应码率的6秒数据,再开始播放。

MX Player在线播放优化

经过数据统计,码率切换平均等待时间为2.8秒。

MX Player在线播放优化

如何减小切换等待时间呢?同样的,减小缓冲区的方案比较简单粗暴,直接pass。

可以注意到,图中红色的丢弃缓冲区,原本是可以正常播放的,只是因为用户需要切换码率,所以丢弃。那么是否可以重用该缓冲区呢?答案是肯定的。

MX Player在线播放优化

如图是优化后的平滑码率切换方案:当播放器进行码率切换时,并不会进入暂停,而是继续播放当前码率上已经缓冲好的数据,并开辟一个新的缓冲区来缓冲对应码流的6秒数据,同时当旧缓冲区数据播放完,进行缓冲区切换。

MX Player在线播放优化

业务上线后经数据统计,优化后的码率切换平均等待时间由原来的2.8秒降为0.4秒。

-04-

缓存面临的挑战

MX Player在线播放优化

接下来介绍缓存面临的挑战以及对应的解决方法。

前述提到MX Player在线用户主要分布在印度,他们的设备偏低端,内存空间普遍都非常小。在业务上线之初,我们给缓存空间定了一个上限为2G。上线后,后台收到了大量的用户反馈,说App占用空间过大。经过我们的讨论和决策,把缓存下调到500M,这带来了一个直接的问题:命中率降低。

MX Player在线播放优化

如图是优化前的缓存布局,在容量不变的情况下,分片越小,个数越多,命中率就会越高。

MX Player在线播放优化

基于上述结论,我们得出一个方案:两段缓存

我们把一个完整的分片拆为头尾两部分,头部优先级高,尾部优先级低,并放入缓存空间。当空间满了之后,会先清理掉所有尾部数据。

MX Player在线播放优化

这是优化后的缓存布局。左图为装满6个分为头尾的分片数据,当用户继续使用一段时间后,缓存空间布局就会变成右图的样子,只留下了各个分片的头部数据。

这时如果播放器需要播放内容,到缓冲区查找数据,就会发现右图的命中率一定是比左图布局要高的。

这时回顾一下预加载和快速seek:预加载方案是缓存视频头2秒,和两段缓存中的头部分片数据是吻合的。在快速seek中,如果在1秒缓冲内可以命中缓存的头部数据,并且下载速度大于播放速度,就可以直接启播。

两段缓存方案在后台默默地为其他功能进行支持,这些方案是相辅相成的关系。

-05-

多播放器如何管理

MX Player在线播放优化

接下来介绍多播放器如何管理。

随着业务发展,播放场景也越来越多。这些播放场景之间并不是彼此孤立的,如PIP播放和音乐播放就是互斥关系。当PIP正在播放,用户需要切换音乐播放,就需要暂停PIP,反之亦然。

另外,feed流播放需要和PIP播放以及音乐播放共存。因为feed流播放是无声和自动播放,我们并不希望这种播放打扰用户行为。

MX Player在线播放优化

随着在线业务高速发展,随之而来的是一系列问题。

MX Player在线播放优化

经过讨论决定,我们选择重构部分代码以解决问题,同时定下几条重构原则:

第一,业务代码彼此独立:业务之间无需互相知道;增加新业务无需修改其他业务;启动播放无需判断是否有其他播放。

第二,环境变化自我感知:当App失去声音焦点,自动暂停;程序进入后台,播放器按需暂停;进入音乐播放后,自动暂停PIP。

MX Player在线播放优化

基于以上原则,我们重构了代码,结构如图所示。Player代表底层播放器,并抽象出来PlayerContext的概念。每一个Player必须和Context进行attach,才能播放。Context有一个属性为ready,只有在ready情况下,才能够让播放器启动,否则会暂停。

Context有几个具体的实例,首先是Activity,它是一个安卓标准组件,只有在unReceived的时候才是ready状态;Fragment和Activity类似,只有unReceived才是ready状态;Screen在锁屏时为非ready状态,其他时候都为ready;Global永远都是ready状态。

Activity和Fragment主要用于详情页播放和feed流播放;Screen用于PIP播放;Global用于后台播放。

Player和PlayerContext之间不直接交互,而是通过PlayerManager进行管理。它会监听和维护所有PlayerContext的状态,并根据其状态改变来控制播放器的生命周期变化。同时,Manager会维护Player和Context之间的映射关系。

经过这样的结构重构,我们的业务代码基本实现了解耦,新增业务不需要改动已有业务,并且样本代码不需要出现在具体业务中,PlayerManager可以感知并通知Player进行操作。

以上就是我的全部分享,谢谢大家!


MX Player在线播放优化

▲扫描图中二维码或点击“阅读原文”

查看更多LiveVideoStackCon 2023上海站精彩话题

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
sql执行计划与优化
在我们实际工作中大部分人会遇到sql优化的问题,这篇文章主要介绍SQL优化相关。首先我们怎么发现我们的sql执行效率低呢,最简单的方法就是当用户反馈慢的时候我们就会知道哪里可能会有sql效率影响的问题,这里排除其他影响情况,只考虑数据库sql慢的问题。当然这种方式对于我们来说很被动,我们还可以通过什么方式找到有性能问题sql,我们可以通过MySQL的配置文
Wesley13 Wesley13
3年前
mysql配置调优
工作中,会遇到需要查看mysql的top20慢sql,逐个进行优化,加上必要的索引这种需求,这时就需要开启数据库的慢查询日志的功能1.查询当前慢查询日志的状态\默认为关闭状态mysqlshowvariableslike"
Wesley13 Wesley13
3年前
mysql优化
第一优化你的sql和索引;第二加缓存,memcached,redis;第三以上都做了后,还是慢,就做主从复制或主主复制,读写分离,可以在应用层做,效率高,也可以用三方工具,第三方工具推荐360的atlas,其它的要么效率不高,要么没人维护;第四如果以上都做了还是慢,不要想着去做切分,mysql自带分区表,先试试这个,对你的应用是透明的,无需更改代
Stella981 Stella981
3年前
Github访问速度很慢的原因,以及解决方法
1,CDN,ContentDistributeNetwork,可以直译成内容分发网络,CDN解决的是如何将数据快速可靠从源站传递到用户的问题。用户获取数据时,不需要直接从源站获取,通过CDN对于数据的分发,用户可以从一个较优的服务器获取数据,从而达到快速访问,并减少源站负载压力的目的。2,为什么访问速度慢、下载慢?答:github的CDN被某墙屏
Wesley13 Wesley13
3年前
ubuntu上网慢的问题
测试用的是ubuntu11.10,教育网宽带,静态IP,无路由如果用的是路由的应该不会很慢吧,路由自带DNS缓存功能的,本地DNS缓存就没有必要了建立本地DNS缓存:(1)安装DNS缓存软件pdnsd:sudoaptgetinstalldnsmasq(2)编辑dnsmasq的配置文件sudovi
Wesley13 Wesley13
3年前
MySQL 8.0窗口函数优化SQL一例
8.0的窗口函数真香1\.问题描述最近在折腾把所有mysqlslowquerylog写入到数据库中,再集中展示,向业务部门开放,也方便业务部门的同学自行查看并优化各自业务内的慢SQL。增加了定期生成报表的功能,统计最近1~2周内的慢查询数量变化情况,给业务方同学更直观的数据对比,了解最近这段时间的慢查询数量变化情况,是多
Wesley13 Wesley13
3年前
mysql 连接慢的问题
现象:今发现站点訪问数据库变慢,经查,查询数据库非常快,连接数据库比較耗时。解决的方法:在mysql的配置文件my.cnf中,在\mysqld\以下加上这个配置就能够了.附录:\mysqld\部分要增加一个參数skipnameresolve:主机名不被解析。增加后在授权表的Host的列值必须是IP数字
Stella981 Stella981
3年前
Spring AOP 切面编程记录日志和接口执行时间
最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx、tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统的响应时间特别长。知道了问题之后,就需要对查询比较慢的接口进行优化,但哪些接口需要优化、哪些不需要呢?只能通过日志里的执行时间来判断,那么如何才能知道每一个接口的执行时间呢
慢SQL的致胜法宝 | 京东物流技术团队
大促备战,最大的隐患项之一就是慢SQL,对于服务平稳运行带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什么思路去解决是我们必须要知道的。本文主要介绍对于慢SQL的排查、解决思路,通过
京东云开发者 京东云开发者
6个月前
大促系统优化之应用启动速度优化实践
作者:京东零售宋维飞一、前言本文记录了在大促前针对SpringBoot应用启动速度过慢而采取的优化方案,主要介绍了如何定位启动速度慢的阻塞点,以及如何解决这些问题。希望可以帮助大家了解如何定位该类问题以及提供一些解决此类问题的思路。下文介绍的JSF为京东内
京东云开发者 京东云开发者
1个月前
大促系统优化之应用启动速度优化实践
作者:京东零售宋维飞一、前言本文记录了在大促前针对SpringBoot应用启动速度过慢而采取的优化方案,主要介绍了如何定位启动速度慢的阻塞点,以及如何解决这些问题。希望可以帮助大家了解如何定位该类问题以及提供一些解决此类问题的思路。(本文使用的Spring
杨志
杨志
Lv1
夜寒茅店不成眠,残月照吟鞭。
文章
3
粉丝
0
获赞
0