小米手机如何循环播放本地视频(手机如何循环播放本地视频vivo)
小米手机如何循环播放本地视频(手机如何循环播放本地视频vivo),新营销网红网本栏目通过数据整理汇集了小米手机如何循环播放本地视频(手机如何循环播放本地视频vivo)相关信息,下面一起看看。
短视频作为重要的内容承载方式,是吸引用户的重点。短视频的内容和体验直接影响用户是否愿意长期停留。所以体验的优化尤为重要。
跨页连播跨页连播是除了秒播之外,另一个可以从体感上增加用户体验的能力。因为有些业务场景需要在不同的页面上播放相同的视频内容,而这些场景的页面切换往往是连续的,这就要求短视频要连续播放。这样在体验上会有连续性,让用户在进入沉浸式页面时,继续流畅播放,没有任何感知,产生连续不间断的感觉。
优化前,盒马沉浸式短视频播放页面的体验与主流短视频App有明显差距。当从卡片列表页面跳转到视频沉浸页面时,同一视频无法继续播放,影响用户观看和体验。下面主要介绍盒马短视频从普通展示页面进入沉浸式页面时,跨页面连续播放能力和流畅动画切换效果的实现过程。
环境
手机像素4
操作系统安卓10
玩家淘宝玩家
效果对比
我们来看看盒马优化前后和主流短视频App的效果对比。
问题分析
通过对比可以看出,连续播放的关键在于视频流的复用和页面过渡的动画。
视频流的多路复用
要解决流重用的问题,要保证当进入新的页面时,可以立即播放,不会出现声音或画面受挫的情况。根据前文《拒绝卡顿,盒马鲜生 APP Android 短视频秒播优化方案》的分析,需要解决视频下载、加载、解码的耗时问题。
根据《拒绝卡顿,盒马鲜生 APP Android 短视频秒播优化方案》中提到的缓存原理,这里可以使用播放器播放同一个视频(注意统一网址,所有盒子都转换为H.265)避免多次下载。
解码的耗时需要播放器复用来解决。这里涉及到的实现方案,请参考下一章连续广播方案的选择。
过渡动画
转场动画可以显著提高体感的流畅性,但在实现过程中需要考虑各种兼容性问题。
连播方案的选择在优化前期,我们考虑了三种连播方案。
1.玩家视图跨页面传递。
优点思路简单,体验效果好。
缺点业务入侵严重,缺乏通用性,无法隔离播放器业务回拨,不利于持续的播放器控制。
2.基于表面(视图)级别的全局玩家管理
优点体验好,扩展内存控制,入侵低。
缺点实现复杂,需要重写底层HMVideoView的封装逻辑;转换中容易发生内存泄漏,很难检查。
3.基于媒体播放器级别的全局播放器管理
优点非入侵,扩展内存控制,实现速度快(淘宝播放器可重用扩展令牌机制)
缺点需要一定的改造,体验比方案一和方案二略差(声音有瞬间的顿挫,不明显)
马最终选择了方案三,方案二和方案三的原理是一样的,没有明显的优劣之分。最终选择方案3,是因为目前稳定性最高,成本最低。以下对球员更新、复用和管理的分析也适用于方案2。
播放器延续、复用和管理
在业务上,我们需要实现连续播放。通过对问题的分析,我们已经知道可以通过视频流的复用来实现,这里的视频流复用是通过复用MediaPlayer(或Surface MediaPlayer)来实现的。
1将播放器视图与MediaPlayer层分离
将MediaPlayer从TaobaoPlayerView中拆解出来,通过MediaPlayerManager进行全局管理。全局管理后,所有播放器的MediaPlayers都由MediaPlayerManager分配和控制。
各种组织之间的关系
2业务流程
确保在业务流程中,只关注业务和VideoView之间的交互,以及重用
每个玩家随机分配一个令牌(时间戳随机数),也可以由开发者指定;
同令牌播放器,共享MediaPlayer;
一个MediaPlayer在同一时间只能被一个玩家面绑定和持有;
存在具有相同令牌的玩家。当当前播放器被销毁时,MediaPlayer实例将被保留;
当创建的播放器恢复播放,但MediaPlayer被后来创建的其他播放器占用时,取消绑定MediaPlayer并重新绑定当前播放器。
4场景模拟
场景1:应用程序创建4个或更少的玩家。
场景2:当创建了4个以上的玩家时。
场景3:当新创建的播放器令牌已经存在时,重用MediaPlayer。
场景4:当现有令牌与当前将要销毁(或已经释放)的玩家令牌一致时
MediaPlayer 的播放器播放时)。
逻辑流程图
从场景,MediaPlayer 主要提供 复用、恢复、销毁、驱逐(创建) 四个能力。
转场动画
目前转场动画有两个方案可选
1. Android 自带的元素动画
优点动画流畅顺滑,无需实现动画逻辑,由系统自己实现。
缺点侵入严重,需要改写 Nav 层,在 View 复用的方案下有白屏和黑屏。
2. 自定义实现属性动画
优点侵入小,只需要前置页极少的坐标信息,如果是 View 复用方案,甚至不需要前置页提供坐标信息;兼容性好,适用于各种播放器复用场景。
缺点需要自己实现动画,有一定的闪烁感。
1动画原理
前置页跳转到沉浸式,传递播放器坐标 Rect 信息;
沉浸式默认透明,并根据 Rect 坐标信息创建播放器(复用);
开始动画,将播放器 View 放大至正确位置,背景不透明度增加。
(注意这里要将沉浸式页的主题设为不透明,否则前置页不会执行 onStop() 具体参考下一节,生命周期填坑。)
ps返回动画同理,过程相反即可。
2生命周期填坑
属性动画原理存在一个坑。
问题描述
假设页面为 A- B,方案 3 要求 B 页面在动画过程中是全透明的。当 B 的 theme 中 windowIsTranslucent 为 true 时,A- B 过程 A 的生命周期无法走向 stop(即便 B 页面动画结束,完全遮盖 A 页面)。,A 的生命周期没有按照预期执行,一些需要 onStop 执行的场景下,业务就无法正常执行
B Ativity 的样式(注示例代码)
stylename= MyTransparent parent= xxxx itemname= android:windowFullscreen false /item itemname= android:windowNoTitle true /item itemname= android:windowBackground @android:color/transparent /item itemname= android:colorBackgroundCacheHint @null /item itemname= android:windowIsTranslucent true /item itemname= android:background @android:color/transparent /item itemname= android:windowAnimationStyle @style/noAnimation /item /style
解决方案
进入动画结束时,通过反射调用 Activity 的 convertFromTranslucent , 使 activity 不透明;
返回动画开始时,通过反射调用 Activity 的 convertToTranslucent ,使 activity 透明。
后续优化展望
关于多媒体的优化工作还有很多可以做。除了续播和沉浸式秒播等场景外,我们还可以
对播放器的一般性场景进行秒播优化,如首页列表的卡片视频;
对播放器的全局实例管控,控制播放器创建数量,从而优化内存。
未优化
操作连续开启 30~50 个页面及播放器。
现象内存飙升,手机发烫,影响手机正常使用。
优化后
操作每秒开启 1 个页面和播放器,连续开启 100 个。
现象内存呈锯齿状正常上升,无明显飙升现象,软件运行正常。
下一期我们将继续分享盒马 iOS 端短视频续播的体验优化实践。
循环播放本地视频
更多小米手机如何循环播放本地视频(手机如何循环播放本地视频vivo)相关信息请关注本文章,本文仅仅做为展示!