Android 通用視頻組件開發

背景

  • 目前車機的多媒體App都是各自維護自己的UI視圖及基礎邏輯,會有不少重復代碼。并且大多數媒體App都會和本地多媒體有交互,所有媒體App都會接入到MediaCenter,沒有統一的接口會導致接入適配成本和維護成本比較高。所以希望能夠抽出公共基礎功能到sdk中,供所有媒體App使用,從一致性和開發效率上得到提升。
  • 應用App:QQ音樂、杜比播放器、本地多媒體、迷你播放器

快速上手

為了應對不同的使用場景,接入方式有兩種:

  • 打包播放器和UI一鍵接入
  • 單獨視頻UI(自行實現播放器)

可根據實際使用場景選擇其一即可,如無特殊原因建議選擇第一種方式。

1 添加依賴

在app的Gradle中加入以下依賴:

implementation 'com.max.media:media-video:$mediaVersion'

2 初始化播放器

PlayerInitializer.init(context, isVideo = true, enableMediaCenter = true)
  • Context:上下文對象,必填
  • isVideo:視頻還是音頻,必填
  • enableMediaCenter :是否接入媒體中心,默認true

3 接入視頻UI組件

添加FlexPlayerView布局,用于展示視頻內容及播控組件:

<com.flex.uniteplayer.ui.FlexPlayerViewandroid:id="@+id/player_view"android:layout_width="match_parent"android:layout_height="match_parent"/>

4 配置視頻組件

可通過FlexPlayerView對視頻組件進行設置:

接口說明
fun setTitleBarVisible(visible: Boolean)隱藏視頻標題欄,包括標題和左側關閉
fun enableUpDownGesture(enable: Boolean)設置是否支持上下手勢
bindControlView(listener: ControlViewListener)綁定視頻控件UI,獲取組件UI控制器,可直接管理視頻組件。如果需要對視頻組件做更多操作可使用此接口(后文會詳細說明)

5 播放視頻

5.1 創建播放器

首先創建一個播放器FlexSimlePlayer:

class FlexSimplePlayer(context: Context?,isVideo: Boolean,enableParkDetect: Boolean = true,enableParkDialog: Boolean = true)

參數說明:

參數說明
context上下文;
enableParkDetect只針對視頻生效,是否啟用行車娛樂限制,非駐車檔會自動暫停視頻播放;
enableParkDialog只針對視頻生效,是否彈出行車娛樂限制框,設置為disable后需要應用可以自己實現提示界面;
5.2 開始播放
player.startPlay(context: Context,mediaData: List<MediaData>,view: FlexPlayerView?,listener: FlexMediaListener?,mediaCenterData: MediaCenterData? = null)

參數說明:

參數說明
context上下文,注意視頻播放要使用activity的context,因為行車娛樂限制需要彈框
mediaData媒體列表,每個媒體item包括url、metadata、mimetiype,其中url是媒體地址,可以是本地、在線點播或直播地址,medadata是media3的原始類型,title和artist字段會顯示在mini播放器和PSD上,mimeTypes指定媒體類型,url是對應后綴的無需設置,有些比如優酷投屏中有一個直播url是/m3u8結尾 而不是.m3u8結尾 需要設置mimeTypes = MimeTypes.APPLICATION_M3U8;
view類型為FlexPlayerView,自實現UI的此參數設置為null
listener媒體播放監聽回調,具體回調接口后面詳細展開,不需要監聽設置為null
mediaCenterData媒體中心中需要用的數據,比如應用包名、圖標等,具體類型后面詳細展開,這里需要注意的是sourceType要設置為6,在媒體中心中對應SourceType.SOURCE_TYPE_ONLINE。
5.3 更新播放列表
fun updateMediaItems(mediaData: List<MediaData>)
5.4 停止播放
player.stopPlay()

到這里,視頻就可以正常播放了。當然這個是最簡單的播放,更多詳細的可以參考:統一媒體播放器接入指南

對于已有播放器且對播放器有特定要求的App而言,可以選擇單獨接入視頻UI,保持全局統一。

視頻組件設置接口

在快速上手第4步“配置視頻組件”中提到一個接口:bindControlView()

接口定義如下:

 /**
* 提供給APP的接口,用于APP定制視頻控制UI
*/
interface ControlViewListener {fun onBindView(controlView: IPlayerCallback.ViewController)
}

方法onBindeView返回的是ViewController,視頻組件提供的控制器,可以針對視頻組件進行更細致的配置。

下面詳細講解ViewController,標紅的為常用接口,希望重點關注!

1 設置全屏模式

 /**
* 設置2/3 屏樣式
*/
fun setAppFrameWH()/**
* 設置全屏樣式
*/
fun setFullScreenWH()

全屏App必設接口

針對全屏和2/3屏有不同的UI樣式(包括ICON大小、間距等等),所以在切換全屏模式的時候一定要同步設置接口,否則UI布局會異常。默認為2/3屏樣式

2 自定義功能Button

為了適配更多的應用場景,我們將播放器下方最多5個Button開放兩種定制方法。最左側固定為播放按鈕,不能修改,其余5個均可以自定義,如果不設置則默認不顯示。

  • 對于只需要簡單設置button的icon和點擊事件的場景,可以直接使用方案一
  • 對于需要對Button做更多定制功能的,比如動效、動態替換、長按、雙擊事件等,需要使用方案二

· 方案一

如前描述,通過此方法可以輕松修改Button的Icon及點擊事件

方法名非常直觀,如下:

 /**
* 設置Left Button2樣式
*  @param resId
*  @param clickListener 點擊事件
*/
fun setLeftButton2(@DrawableRes resId: Int = 0,clickListener: OnClickListener? = null,visible: Boolean = true,
)/**
* 設置Left Button3樣式
*  @param resId
*  @param clickListener 點擊事件
*/
fun setLeftButton3(@DrawableRes resId: Int = 0,clickListener: OnClickListener? = null,visible: Boolean = true,
)/**
* 設置right Button1樣式
*  @param resId
*  @param clickListener 點擊事件
*/
fun setRightButton1(@DrawableRes resId: Int = 0,clickListener: OnClickListener? = null,visible: Boolean = true,
)/**
* 設置right Button2樣式
*  @param resId
*  @param clickListener 點擊事件
*/
fun setRightButton2(@DrawableRes resId: Int = 0,clickListener: OnClickListener? = null,visible: Boolean = true,
)/**
* 設置right Button3樣式
*  @param resId
*  @param clickListener 點擊事件
*/
fun setRightButton3(@DrawableRes resId: Int = 0,clickListener: OnClickListener? = null,visible: Boolean = true,
)

顧名思義,找到你需要自定義的Button,按照參數設置即可

· 方案二

如果你需要針對Button做更深入的定制,那么可以通過以下接口直接拿到Button實例,則可以設置你需要的任何屬性。

 /**
* 獲取Button
*  @param viewType 根據Type獲取對應的Button
*/
fun getButton(viewType: ButtonType): ImageView

3 獲取進度條

對于部分App需要自定義進度條,或者拿到進度條實例做一些監聽及修改,可以通過以下接口實現:

 /**
* 獲取進度條
*/
fun getProgressBar(): FlexProgressBar

4 設置關閉按鈕左邊距

 /**
* 設置關閉按鈕距離
*/
fun setCloseMargin(left: Int, top: Int = CLOSE_MARGIN_TOP)

5 設置進度條左右邊距


/**
* 設置進度條距離
*/
fun setProgressMargin(bottom: Int,left: Int = BOTTOM_BAR_MARGIN_LEFT,right: Int = BOTTOM_BAR_MARGIN_RIGHT)

6 設置Loading延遲顯示時間

默認1000ms內的loading不進行展示,若需要不控制loading時長則可以該屬性設置為0.

ViewController.loadingDelayDurationMillisecond

Q&A

1 可以讓播放器和視頻組件版本獨立嗎?

可以,并且這個是推薦的做法。

目前播放器內部集成了視頻組件,也就是說只需要依賴視頻播放器即可包含視頻組件。但是視頻組件和播放器版本是分開管理的,可能播放器的版本是滯后的。建議依賴了視頻播放器之后,在單獨加一個視頻組件的依賴,如下:

implementation 'com.max.mediaplayer:uniteplayer:$playerVersion'
implementation 'com.max.media:media-video:$mediaVersion'

版本更新記錄

內測版

僅SNAPSHOT:

**版本(內測版,僅SNAPSHOT)更新日志
0.5.01. 視頻基礎控制;
2. 支持配置底部icon的資源id和點擊事件
0.6.01. 修復手勢滑動bug
0.6.21. 修復底部icon接口Bug
0.7.01. 增加了錯誤頁提示
2. 修復部分rom不能調亮度的問題
3. 自適應平板和車機
4. 修復暫停后拖動進度條持續loading的問題
0.8.61. 支持禁用上下滑手勢
2. 調整視頻View層級
0.9.01. 支持監聽視頻組件的雙擊、長按事件
2. 去掉toggleControlView接口

正式版

版本更新日志
1.0.01. 修改controlView實例的獲取方式,改為異步調用
2. 支持2/3屏和全屏兩套UI布局模式一鍵切換
1) 2/3屏模式:controlView.setAppFrameWH()
2)全屏模式:controlView.setFullScreenWH()
3. 支持自定義LoadingView、進度條邊距及icon尺寸
4. 修改UI走查問題
1.1.01. 修復視頻時長小于1h時格式問題
2. 優化上下手勢和Dock欄沖突
3. 調節亮度時取消自動調節亮度勾選
4. 修復持續上下手勢,Tips閃爍
5. Loading態支持調起控件
6. 處理加載頁和錯誤頁互斥邏輯
1.2.01. 上下手勢不主動調起播控UI
2. 視頻手勢層級優化
3. Loading支持播控UI調起
4. UI樣式優化
1.2.21. 滑動進度條時,顯示進度Tips
2. 進度條及底部Bar優化
1.2.31. 滑動進度,展示進度Tips
1.2.51. 調整進度條樣式
1.2.6優化全屏狀態下標題欄位置
1.2.71. 優化全屏Toast位置(居中改到頂部)
1.3.51. [視頻播放器UI]優化在車機屏幕下雙擊/單擊事件的閾值和行為
2. [視頻播放器UI]優化在電話場景下播放器依然能夠點擊的問題
3. [視頻播放器UI]支持自定義播放器UI控制效果
4. [視頻播放器UI]支持自定義loading延遲時長,默認1s內loading不顯示.
5. [視頻播放器UI]支持3/2全屏無縫播放效果
6. [音樂播放器]大小播放器設計/動效支持

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/44628.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44628.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/44628.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分享一個項目模板electron+vue+ts+vite

分享一個項目模板electronvuetsvite GitHub - xiugou798/electron-vue-ts-vite-template: electron-vue-ts-vite-templateelectron-vue-ts-vite-template. Contribute to xiugou798/electron-vue-ts-vite-template development by creating an account on GitHub.https://gith…

linux之內存泄漏分析

內存泄漏通常是指程序中動態分配的內存沒有被適時釋放&#xff0c;導致這部分內存在程序的生命周期內一直無法被再次利用。內存泄漏不會直接導致程序崩潰&#xff0c;所以通常不會生成core dump文件。然而&#xff0c;如果程序因為其他原因崩潰&#xff0c;那么core dump文件可…

弱電工程質量保修期是多久?

弱電工程是電力工程的一個分類&#xff0c;弱電可以向人們提供照明用電和空調用電&#xff0c;為人們的生活帶來了極大的便利。弱電工程作為一類工程項目存在質量保證問題&#xff0c;在施工完成后需要進行質量檢修&#xff0c;施工隊應該向業主提供一定的質量保修期&#xff0…

java 數據庫連接池的種類和選型

文章目錄 1.引言數據庫連接池的重要性Java數據庫連接池的基本概念連接池需要注意的問題 2.數據庫連接池C3P0數據庫連接池C3P0的基本介紹C3P0的使用示例 DBCP數據庫連接池DBCP的基本介紹DBCP的使用示例 HikariCP數據庫連接池&#xff08;廣泛使用&#xff09;HikariCP的基本介紹…

LLM大模型應用中的安全對齊的簡單理解

LLM大模型應用中的安全對齊的簡單理解 隨著人工智能技術的不斷發展&#xff0c;大規模語言模型&#xff08;如GPT-4&#xff09;的應用越來越廣泛。為了保證這些大模型在實際應用中的性能和安全性&#xff0c;安全對齊&#xff08;Safe Alignment&#xff09;成為一個重要的概…

CentOS 7 編譯安裝 sqlite3

1. 下載 sqlite3 源碼 網址&#xff1a; https://www.sqlite.org/download.html [注]&#xff1a;可自行選擇版本&#xff0c;也可與筆者保持一致。 wget https://www.sqlite.org/2024/sqlite-autoconf-3460000.tar.gz2. 解壓編譯并安裝 解壓源碼包&#xff0c;并進入源碼…

實驗-ENSP實現防火墻區域策略與用戶管理

目錄 實驗拓撲 自己搭建拓撲 實驗要求 實驗步驟 整通總公司內網 sw3配置vlan 防火墻配置IP 配置安全策略&#xff08;DMZ區內的服務器&#xff0c;辦公區僅能在辦公時間內&#xff08;9: 00- 18:00)可以訪問&#xff0c;生產區的設備全天可以訪問&#xff09; 配置nat策…

【代碼隨想錄_Day29】卡碼網46. 攜帶研究材料(二維數組) 46. 攜帶研究材料(滾動數組/一維) 416 分割等和子集

Day29 OK&#xff0c;今日份的打卡&#xff01;第二十九天 以下是今日份的總結攜帶研究材料(二維數組)攜帶研究材料(滾動數組/一維)分割等和子集 以下是今日份的總結 46 攜帶研究材料(二維數組) 46 攜帶研究材料(滾動數組/一維) 416 分割等和子集 今天的題目難度不低&#xf…

Android 性能優化之內存優化

文章目錄 Android 性能優化之內存優化內存問題內存抖動內存泄露內存溢出 檢測工具Memory ProfilerMemory AnalyzerLeakCanary 內存管理機制JavaAndroid 解決內存抖動問題模擬問題代碼使用Memory Profiler工具檢測優化技巧 內存泄露問題模擬問題代碼使用LeakCanary工具檢測優化技…

順序結構 ( 四 ) —— 標準數據類型 【互三互三】

序 C語言提供了豐富的數據類型&#xff0c;本節介紹幾種基本的數據類型&#xff1a;整型、實型、字符型。它們都是系統定義的簡單數據類型&#xff0c;稱為標準數據類型。 整型&#xff08;integer&#xff09; 在C語言中&#xff0c;整型類型標識符為int。根據整型變量的取值范…

開源大勢所趨

一、開源項目的發展趨勢 技術棧多樣化與專業化&#xff1a;隨著技術的不斷進步&#xff0c;開源項目涵蓋了從云計算、大數據、人工智能到區塊鏈、物聯網等各個領域&#xff0c;技術棧日益豐富和專業化。這種趨勢使得開發者能夠根據自己的需求選擇最適合的技術工具&#xff0c;促…

dify-api的Dockerfile分析

一.dify-api的Dockerfile文件 dify-api的Dockerfile文件如下所示&#xff1a; # base image FROM python:3.10-slim-bookworm AS baseLABEL maintainer"takatostgmail.com"# install packages FROM base as packagesRUN apt-get update \&& apt-get install…

nginx安裝配置視頻頻服務器-windows

編譯安裝nginx 1、安裝perl 安裝地址: https://strawberryperl.com&#xff0c;選擇msi安裝程序即可 2、安裝sed for windows 下載地址&#xff1a;https://sourceforge.net/projects/gnuwin32/files/sed/&#xff0c;執行安裝程序結束后&#xff0c;將安裝包bin目錄配置到…

【seo常見的問題】搜索引擎

1、讓網站訪問量提高的最好的方法是什么? 了解搜索引擎行為和搜索用戶的行為&#xff0c;就是通過觀察搜索引擎排名機制獲得有效途徑&#xff0c;提供效率&#xff0c;并且通過一些相關數據&#xff0c;了解到用戶的搜索行為。 2、我要你把一個站的關鍵詞排名排到首頁&#x…

【Adobe】動作捕獲和動畫制作軟件Character Animator

Adobe Character Animator 是一款由Adobe公司出品的動作捕獲和動畫制作軟件&#xff0c;旨在幫助用戶直觀地制作2D&#xff08;二維&#xff09;人物動畫、實時動畫&#xff0c;并發布動畫。這款軟件功能強大、操作簡單&#xff0c;非常適合動畫制作者、直播主以及社交媒體內容…

【STM32 ARM】操作寄存器控制led

文章目錄 前言GPIO操作方法led原理圖設置時鐘APB的概念 設置APB設置輸出引腳設置引腳高低電平寄存器尋找寄存器地址 總結 前言 STM32是STMicroelectronics&#xff08;意法半導體&#xff09;公司的一款32位Flash微控制器產品&#xff0c;基于ARM Cortex?-M內核。STM32系列微…

Groovy vs Kotlin 在Gradle配置文件中的差異與選擇

人不走空 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌賦&#xff1a;斯是陋室&#xff0c;惟吾德馨 目錄 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌…

beyond Compare連接 openWrt 和 VsCode

連接步驟總結 1. 新建會話 -> 文件夾比較 2.點擊瀏覽文件夾 3.在彈出頁面 配置 ftp 3.1&#xff09;選中ftp 配置文件 3.2)選中ssh2 3.3)填寫我們需要遠端連接的主機信息 先點擊連接并瀏覽 得到下方文件夾 彈出無效登錄&#xff0c;說明需要密碼 我們返回右鍵剛剛創建的新 …

C++ | Leetcode C++題解之第227題基本計算器II

題目&#xff1a; 題解&#xff1a; class Solution { public:int calculate(string s) {vector<int> stk;char preSign ;int num 0;int n s.length();for (int i 0; i < n; i) {if (isdigit(s[i])) {num num * 10 int(s[i] - 0);}if (!isdigit(s[i]) &&am…

【智能制造-14】機器視覺軟件

CCD相機和COMS相機? CCD&#xff08;Charge-Coupled Device&#xff09;相機和CMOS&#xff08;Complementary Metal-Oxide-Semiconductor&#xff09;相機是兩種常見的數字圖像傳感器技術&#xff0c;用于捕捉和處理圖像。 CCD相機&#xff1a; CCD相機使用一種稱為CCD的光電…