0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MX Player在线播放优化

LiveVideoStack 来源:LiveVideoStack 2023-07-10 14:41 次阅读

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

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

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

9d158a72-1ec9-11ee-962d-dac502259ad0.png

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

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

9d6489a6-1ec9-11ee-962d-dac502259ad0.png

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

9d8c7a9c-1ec9-11ee-962d-dac502259ad0.png

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

-01-

秒开

9dc2bc74-1ec9-11ee-962d-dac502259ad0.png

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

9deb4cac-1ec9-11ee-962d-dac502259ad0.png

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

9e3a3f1a-1ec9-11ee-962d-dac502259ad0.png

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

9e890b68-1ec9-11ee-962d-dac502259ad0.png

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

9eb2b3b4-1ec9-11ee-962d-dac502259ad0.png

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

9eeffdd2-1ec9-11ee-962d-dac502259ad0.png

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

9f33e718-1ec9-11ee-962d-dac502259ad0.png

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

-02-

快速seek

9f8a8668-1ec9-11ee-962d-dac502259ad0.png

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

9fbe0f9c-1ec9-11ee-962d-dac502259ad0.png

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

9ff60b68-1ec9-11ee-962d-dac502259ad0.png

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

a02252fe-1ec9-11ee-962d-dac502259ad0.png

那如何减少seek时间呢?

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

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

a05bdeca-1ec9-11ee-962d-dac502259ad0.png

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

a087a1e0-1ec9-11ee-962d-dac502259ad0.png

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

a0d702da-1ec9-11ee-962d-dac502259ad0.png

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

-03-

平滑码率切换

a10c1268-1ec9-11ee-962d-dac502259ad0.png

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

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

a153775c-1ec9-11ee-962d-dac502259ad0.png

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

a18efc64-1ec9-11ee-962d-dac502259ad0.png

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

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

a1c49482-1ec9-11ee-962d-dac502259ad0.png

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

a1ea9bfa-1ec9-11ee-962d-dac502259ad0.png

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

-04-

缓存面临的挑战

a23c3686-1ec9-11ee-962d-dac502259ad0.png

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

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

a2623f84-1ec9-11ee-962d-dac502259ad0.png

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

a2a1c7da-1ec9-11ee-962d-dac502259ad0.png

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

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

a2c929f6-1ec9-11ee-962d-dac502259ad0.png

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

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

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

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

-05-

多播放器如何管理

a30713ec-1ec9-11ee-962d-dac502259ad0.png

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

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

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

a32b2430-1ec9-11ee-962d-dac502259ad0.png

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

a36a06f0-1ec9-11ee-962d-dac502259ad0.png

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

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

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

a39ddc28-1ec9-11ee-962d-dac502259ad0.png

基于以上原则,我们重构了代码,结构如图所示。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进行操作。 以上就是我的全部分享,谢谢大家!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 播放器
    +关注

    关注

    5

    文章

    382

    浏览量

    36827
  • 视频
    +关注

    关注

    6

    文章

    1891

    浏览量

    71903
  • 互联网
    +关注

    关注

    54

    文章

    10906

    浏览量

    100745

原文标题:MX Player在线播放优化

文章出处:【微信号:livevideostack,微信公众号:LiveVideoStack】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    上网本伴侣—PPS高清网络在线播放器诚征全国代理

    宽景科技(KJ)现推出全球首款真正的高清网络在线播放器,只需一根网线,就可让你在玩上网本的同时,家人可以享受到在电视上看海量网络高清电影,不需要下载。1。近十万部海量片源,即时更新,随时
    发表于 09-24 16:14

    基于labview的mp3 player播放器GAMP

    labview mp3 player在labview中利用ActiveX播放MP3文件GAMP是一个基于labview平台的mp3播放器它包括一个播放列表功能,可以连续
    发表于 10-28 09:36

    labview调用media player播放窗口大小如何更改?

    如题,请问我用labview调用windows media player播放视频时播放窗口的大小如何锁定,现在一点开始播放窗口就自动变得很大
    发表于 03-31 14:46

    labview调用media player问题

    本帖最后由 若一心之念 于 2017-5-5 18:36 编辑 第一次循环可以正常播放,第二次循环media player无响应,是什么原因?此时单独点击media player依然是继续
    发表于 05-05 18:33

    SurfaceProvider+Player视频播放开发过程分享

    的是SurfaceProvider+ Player 完成的播放 pause()暂停播放。getCurrentTime()获取当前播放位置。getDuration()获取媒体文件总时长
    发表于 03-08 09:29

    基于HarmonyOS Player,实现音频的播放、管理控制和采集

    收集和系统音量控制的用法。本篇Codelab将实现的内容您将构建一个应用程序实现以下内容:基于HarmonyOS Player播放本地音频资源或从Internet获得的音频资源。通过音频采集器采集现场
    发表于 09-16 15:07

    基于HarmonyOS Player,实现视频文件的播放

    和布局的编写,再到编译构建、部署和运行全过程。您将构建一个基于HarmonyOS Player类实现的应用程序,该应用程序功能为播放本地视频资源或从Internet获得的视频资源。效果图如下:您将
    发表于 09-18 13:51

    Harmony player组件如何自动循环播放音乐?

    );player.prepare();播放器.play();复制通过播放器组件播放应用的背景音乐,播放完毕后就停止了,如何在程序中自动设置无
    发表于 04-20 10:43

    请问鸿蒙player组件如何自动循环播放音乐?

    );player.prepare();播放器.play();通过播放器组件播放应用的背景音乐,播放完毕后就停止了,如何在程序中自动设置无限循
    发表于 05-11 10:23

    i.MX Windows 10 IoT 1.4.0上的视频播放失败的原因?怎么解决?

    大家好,我们正在尝试将i.MX Windows 10 IoT 1.4.0 与 – 8MPLUSLPD4-EVK 一起使用 。我们看到了以下与视频播放相关的评论和预期的改进。发行说明P2 上的那些评论
    发表于 04-07 09:04

    Windows Media Player音乐播放器代码

    Windows Media Player音乐播放器代码 一、Windows Media Player音乐播放器代码:
    发表于 01-10 11:14 2201次阅读

    《珠光宝气》登陆土豆网 创在线播放佳绩

    《珠光宝气》登陆土豆网 创在线播放佳绩       上海2009年10月12日电 -- 国庆期间,香港无线电视台年度巨制
    发表于 10-15 08:44 982次阅读

    海信成功实现了5G信号下8K超高清视频的在线播放

    海信工程师利用中国移动设在青岛研发中心总部的5G信号基站,通过具有8K解码和8K显示功能的海信电视产品,在线下载并播放存储在中国移动相关服务器上的8K视频,成功实现了5G+8K视频的在线播放
    的头像 发表于 08-04 10:04 4657次阅读

    UOS系统与奇安信旗下安全浏览器完成产品认证 支持1080p视频在线播放

    今天统信软件宣布UOS系统与奇安信旗下的安全浏览器完成了产品认证,支持国家加密标准,也能胜任1080p视频在线播放等复杂场景。
    的头像 发表于 04-08 08:47 2477次阅读

    新版Flash Player推送:Win7以下系统不再支持视频格式内容播放

    1月12日消息,重橙网络官方微博宣布,今天新版Flash Player已经更新,其中包括可用性、在线安全及稳定性的改善,最新版本号为34.0.0.92。 根据重橙网络此前发布的公告,由于技术支持原因
    的头像 发表于 01-12 18:11 2562次阅读