如何实现 Android 短视频跨页面的流畅续播?
作者|少陽
審校|泰一
短視頻作為內容重要的承載方式,是吸引用戶的重點,短視頻的內容與體驗直接關系到用戶是否愿意長時停留。因此,體驗的優(yōu)化就顯得尤為重要。
跨頁面續(xù)播
跨頁面續(xù)播是除秒播外另一個可以從體感上增加用戶體驗的能力。由于一些業(yè)務場景需要在不同頁面上播放同一個視頻內容的場景,而這些場景頁面切換往往是連續(xù)的,這就要求短視頻的播放也是連續(xù)。這樣才能使得體驗上會有連貫性,讓用戶在進入沉浸式頁面時,能流暢的過度,并無感知的繼續(xù)播放,從而產生連續(xù)不間斷的感受。
在優(yōu)化前,盒馬沉浸式短視頻播放頁面的體驗與主流短視頻 App 有明顯差距。從卡片列表頁面跳轉視頻沉浸式頁面時,相同視頻無法續(xù)播,影響用戶觀賞和體驗。下面主要介紹盒馬短視頻從普通展示頁進入沉浸式頁面時跨頁面續(xù)播能力和流暢的動畫切換效果的實現(xiàn)過程。
環(huán)境
- 手機:Pixel 4
- os:Android 10
- 播放器:淘寶播放器
效果對比
首先我們來看一下盒馬優(yōu)化前后與主流短視頻 App 的效果對比
問題分析
從對比可以看出,續(xù)播的關鍵在于視頻流的復用以及頁面轉場動畫。
◆?視頻流的復用
要解決流的復用,同時又要保證進入新的頁面時可以立即播放,不產生聲音和畫面的頓挫,這里根據(jù)上一篇《揭秘盒馬鮮生 APP Android 短視頻秒播優(yōu)化方案》的分析,必須要解決視頻下載,加載解碼的耗時。
- 根據(jù)《揭秘盒馬鮮生 APP Android 短視頻秒播優(yōu)化方案》里講到緩存原理,這里可以利用播放器播放同一個視頻(注意統(tǒng)一 URL,盒馬全部轉為 H.265)來避免多次下載。
- 加載解碼的耗時則需要播放器復用來解決。這里涉及到實現(xiàn)方案,可參照下一章的續(xù)播方案選型。
◆?轉場動畫
轉場動畫能顯著提高體感流暢度,但實現(xiàn)過程中需要考慮各種兼容問題。
續(xù)播方案選型
在優(yōu)化前期,我們考慮了三種續(xù)播方案。
1. 播放器 View 跨頁面?zhèn)鬟f優(yōu)點:思路簡單,體驗效果好。缺點:業(yè)務侵入嚴重,不具通用性,播放器業(yè)務回調無法隔離,不利于續(xù)播放器管控。
2. 基于 Surface (View) 級別的全局播放器管理優(yōu)點:體驗效果好,能擴展內存管控,侵入性低。缺點:實現(xiàn)復雜,需要改寫底層 HMVideoView 的封裝邏輯;改造中易出現(xiàn)內存泄漏,較難排查。
3. 基于 MediaPlayer 級別的全局播放器管理優(yōu)點:無侵入,能擴展內存管控,實現(xiàn)快(可復用和擴展淘寶播放器底層 token 機制)缺點:需要一定的改造,體驗比方案 1、2 略差(聲音有一瞬間的頓挫,不明顯)
盒馬最終選擇方案 3,這里方案 2 和 3 原理是相同的,沒有明顯的優(yōu)劣之分,最終選擇方案 3 是因為這是目前穩(wěn)定性最高,成本最低的方法。后續(xù)的播放器續(xù)播、復用、管理的分析同樣適用于方案 2。
播放器續(xù)播、復用和管理
業(yè)務上,我們需要實現(xiàn)續(xù)播,通過問題分析,我們已經(jīng)知道,通過視頻流的復用即可實現(xiàn),而視頻流的復用這里選擇通過復用 MediaPlayer 實現(xiàn)(也可以復用 Surface+MediaPlayer)。
◆解耦播放器 View 與 MediaPlayer 層
將 MediaPlayer 從 TaobaoPlayerView 中拆解出來,通過 MediaPlayerManager 進行全局管理。全局管理后,所有的播放器的 MediaPlayer 都由 MediaPlayerManager 分配和控制。
各組建間關系
◆業(yè)務流程
確保業(yè)務流程中,只需要關心業(yè)務與 VideoView 之間的交互,底層播放器復用由 MediaPlayerManager 實現(xiàn)。
◆播放器復用(管理)原理
播放器復用是管理的一個子集,所以這里一起介紹。主要原來有以下幾個原則:
1. 全局播放器(MediaPlayer)控制最多創(chuàng)建 4 個。
2. 超過 4 個播放器,創(chuàng)建第 5 個時,先銷毀最少使用的播放器的 MediaPlayer。
3. 每個播放器隨機分配一個 token(時間戳 + 隨機數(shù)),也可以開發(fā)者指定。
4. 相同 token 的播放器,共享 MediaPlayer。
5. 一個 MediaPlayer 同時只能被 1 個播放器 Surface 所綁定和持有。
6. 存在相同 token 的播放器,當前播放器在銷毀時,保留 MediaPlayer 實例。
7. 已創(chuàng)建的播放器恢復播放,但 MediaPlayer 被其他后創(chuàng)建的播放器占用時,解綁 MediaPlayer 并重新綁定當前播放器。
◆場景模擬
場景一:APP 共創(chuàng)建 4 個及以內播放器。
場景二:創(chuàng)建超過 4 個播放器時。
場景三:新創(chuàng)建的播放器 token 已存在時,復用 MediaPlayer。
場景四:存在 token 與當前即將被銷毀的播放器 token 一致時(或已被解除 MediaPlayer 的播放器播放時)。
邏輯流程圖
從場景總結,MediaPlayer 主要提供 復用、恢復、銷毀、驅逐(創(chuàng)建) 四個能力。
轉場動畫
目前轉場動畫有兩個方案可選:
1. Android 自帶的元素動畫
優(yōu)點:動畫流暢順滑,無需實現(xiàn)動畫邏輯,由系統(tǒng)自己實現(xiàn)。
缺點:侵入嚴重,需要改寫 Nav 層,在 View 復用的方案下有白屏和黑屏。
2. 自定義實現(xiàn)屬性動畫
優(yōu)點:侵入小,只需要前置頁極少的坐標信息,如果是 View 復用方案,甚至不需要前置頁提供坐標信息;兼容性好,適用于各種播放器復用場景。
缺點:需要自己實現(xiàn)動畫,有一定的閃爍感。
◆動畫原理
1. 前置頁跳轉到沉浸式,傳遞播放器坐標 Rect 信息。
2. 沉浸式默認透明,并根據(jù) Rect 坐標信息創(chuàng)建播放器(復用)。
3. 開始動畫,將播放器 View 放大至正確位置,同時背景不透明度增加。
(注意:這里最后要將沉浸式頁的主題設為不透明,否則前置頁不會執(zhí)行 onStop ()? ?具體參考下一節(jié),生命周期填坑。)
ps:返回動畫同理,過程相反即可。
◆生命周期填坑
屬性動畫原理存在一個坑。
問題描述:
假設頁面為 A->B,方案 3 要求 B 頁面在動畫過程中是全透明的。當 B 的 theme 中 windowIsTranslucent 為 true 時,A->B 過程 A 的生命周期無法走向 stop(即便 B 頁面動畫結束,完全遮蓋 A 頁面)。因此,A 的生命周期沒有按照預期執(zhí)行,一些需要 onStop 執(zhí)行的場景下,業(yè)務就無法正常執(zhí)行
B Ativity 的樣式(注:示例代碼):
<style name="MyTransparent" parent="xxxx"> <item name="android:windowFullscreen">false</item> <item name="android:windowNoTitle">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:colorBackgroundCacheHint">@null</item> <item name="android:windowIsTranslucent">true</item> <item name="android:background">@android:color/transparent</item> <item name="android:windowAnimationStyle">@style/noAnimation</item> </style>解決方案:
1. 進入動畫結束時,通過反射調用 Activity 的 convertFromTranslucent 方法, 使 activity 不透明。
2. 返回動畫開始時,通過反射調用 Activity 的 convertToTranslucent 方法,使 activity 透明。
后續(xù)優(yōu)化展望
關于多媒體的優(yōu)化工作還有很多可以做。除了續(xù)播和沉浸式秒播等場景外,我們還可以:
1. 對播放器的一般性場景進行秒播優(yōu)化,如首頁列表的卡片視頻。2. 對播放器的全局實例管控,控制播放器創(chuàng)建數(shù)量,從而優(yōu)化內存。
未優(yōu)化:
操作:連續(xù)開啟 30~50 個頁面及播放器。
現(xiàn)象:內存飆升,手機發(fā)燙,影響手機正常使用。
優(yōu)化后:
操作:每秒開啟 1 個頁面和播放器,連續(xù)開啟 100 個。
現(xiàn)象:內存呈鋸齒狀正常上升,無明顯飆升現(xiàn)象,軟件運行正常。
下一期我們將繼續(xù)分享盒馬 iOS 端短視頻續(xù)播的體驗優(yōu)化實踐。歡迎關注「視頻云技術」公眾號。
「視頻云技術」你最值得關注的音視頻技術公眾號,每周推送來自阿里云一線的實踐技術文章,在這里與音視頻領域一流工程師交流切磋。公眾號后臺回復【技術】可加入阿里云視頻云產品技術交流群,和業(yè)內大咖一起探討音視頻技術,獲取更多行業(yè)最新信息。
原文鏈接:https://developer.aliyun.com/article/789978?
版權聲明:本文內容由阿里云實名注冊用戶自發(fā)貢獻,版權歸原作者所有,阿里云開發(fā)者社區(qū)不擁有其著作權,亦不承擔相應法律責任。具體規(guī)則請查看《阿里云開發(fā)者社區(qū)用戶服務協(xié)議》和《阿里云開發(fā)者社區(qū)知識產權保護指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內容,填寫侵權投訴表單進行舉報,一經(jīng)查實,本社區(qū)將立刻刪除涉嫌侵權內容。總結
以上是生活随笔為你收集整理的如何实现 Android 短视频跨页面的流畅续播?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高产攻关保全年粮丰 国稻种芯·中国水稻节
- 下一篇: Android音频播放器