本文介紹Android端集成微短劇項目的操作步驟。
源碼說明
源碼下載
如需獲取源碼詳情,請提交方案咨詢。
環境要求
類別 | 要求 | ||||||
開發環境 | 建議使用Android Studio 4.0及以上版本。 | ||||||
系統版本 | Android 5.0(SDK API Level 21)及以上版本。 | ||||||
其他 | Android 5.0及以上版本的真機,暫不支持模擬器調試。 |
前提條件
您已獲取音視頻終端SDK的播放器的License授權證書和License Key,獲取的詳細步驟請參見申請License。
跑通Demo
獲取Demo源碼后,在Android Studio中打開項目。
將上述步驟中獲取的License授權證書放到
assets/cert
目錄下。打開AndroidManifest.xml文件,修改com.aliyun.alivc_license.licensekey的值為上述步驟中獲取的licensekey,修改com.aliyun.alivc_license.licensefile的值為上一步License授權證書放置的路徑。
<!-- 配置license --> <meta-data android:name="com.aliyun.alivc_license.licensekey" android:value="" /> <meta-data android:name="com.aliyun.alivc_license.licensefile" android:value="" />
真機測試
鏈接Android真機,連接成功后顯示如下圖。
單擊下圖綠色運行按鈕,構建工程文件。
安裝到Android真機上,運行微短劇應用。
集成組件
以下是 AUIShortVideoList 組件的使用方法及其對外接口的詳細介紹,旨在實現短視頻列表播放功能。
集成準備
接入已授權播放器的音視頻終端SDK License。
具體操作,請參見Android端接入License。
將AUIShortVideoList模塊拷貝到您項目工程中。
在項目gradle文件的repositories配置中,引入阿里云SDK的Maven源。
請在項目根目錄的settings.gradle文件中添加以下內容:
Groovy DSL示例
repositories { // aliyun maven maven { url "https://maven.aliyun.com/repository/releases" } }
Kotlin DSL示例
repositories { // aliyun maven maven("https://maven.aliyun.com/repository/releases") }
增加模塊引用方式和依賴方式。
添加模塊引用,請在項目根目錄的settings.gradle文件中添加以下內容:
Groovy DSL示例
// 若 AUIShortVideoList 模塊位于 AUIPlayerKits 文件夾中: include ':AUIPlayerKits:AUIShortVideoList' // 若 AUIShortVideoList 模塊直接放在項目根目錄: include ':AUIShortVideoList'
Kotlin DSL示例
// 若 AUIShortVideoList 模塊位于 AUIPlayerKits 文件夾中: include(":AUIPlayerKits:AUIShortVideoList") // 若 AUIShortVideoList 模塊直接放在項目根目錄: include(":AUIShortVideoList")
添加模塊依賴,請在app模塊的build.gradle文件中添加以下內容:
Groovy DSL示例
// 若 AUIShortVideoList 模塊位于 AUIPlayerKits 文件夾中: implementation project(':AUIPlayerKits:AUIShortVideoList') // 若 AUIShortVideoList 模塊直接放在項目根目錄: implementation project(':AUIShortVideoList')
Kotlin DSL示例
// 若 AUIShortVideoList 模塊位于 AUIPlayerKits 文件夾中: implementation(project(":AUIPlayerKits:AUIShortVideoList")) // 若 AUIShortVideoList 模塊直接放在項目根目錄: implementation(project(":AUIShortVideoList"))
編譯運行,確保組件已被正確集成。
說明集成完成后,建議執行一次
git commit
,提交記錄當前組件最新的 commit ID。這為將來的組件更新提供重要的追溯依據,也記錄了組件更新前后的代碼差異,有效把控集成準入質量。同時還可以在尋求技術支持時快速定位組件版本,從而提高技術支持的效率。集成問題詳見集成FAQ。
在完成 AUIShortVideoList 組件的集成準備后,您可以直接將以下代碼復制到項目中以進行使用。
使用方法
以下提供三種方法,通過不同方式對接AUIShortVideoList模塊,以便快速實現功能運行:
AUIShortVideoListActivity
您可以將短視頻列表播放Activity頁面直接提供給外部進行跳轉,具體調用邏輯可參考以下示例(
videoInfoListJSON
數據獲取,參見獲取數據)。Java示例
// TODO: context is android context Intent intent = new Intent(context, AUIShortVideoListActivity.class); // TODO: videoInfoListJSON is the serialized string of List<VideoInfo> intent.putExtra(AUIShortVideoListView.KEY_VIDEO_INFO_LIST_DATA, videoInfoListJSON); startActivity(intent);
Kotlin示例
// TODO: context is android context val intent = Intent(context, AUIShortVideoListActivity::class.java) // TODO: videoInfoListJSON is the serialized string of List<VideoInfo> intent.putExtra(AUIShortVideoListView.KEY_VIDEO_INFO_LIST_DATA, videoInfoListJSON) startActivity(intent)
AUIShortVideoListFragment
您可以將短劇列表播放Fragment嵌入到Activity頁面或者Fragment頁面中進行使用,具體調用邏輯可參考以下示例:
在XML布局文件中添加FrameLayout,用于承載Fragment:
<FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" />
在代碼中初始化Fragment并嵌入到容器。
Java示例
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { AUIShortVideoListFragment fragment = new AUIShortVideoListFragment(); Bundle bundle = new Bundle(); // TODO: videoInfoListJSON is the serialized string of List<VideoInfo> bundle.putString(AUIShortVideoListView.KEY_VIDEO_INFO_LIST_DATA, videoInfoListJSON); fragment.setArguments(bundle); getSupportFragmentManager() .beginTransaction() .replace(R.id.fragment_container, fragment) .commit(); } }
Kotlin示例
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState == null) { val fragment = AUIShortVideoListFragment() val bundle = Bundle() // TODO: videoInfoListJSON is the serialized string of List<VideoInfo> bundle.putString(AUIShortVideoListView.KEY_VIDEO_INFO_LIST_DATA, videoInfoListJSON) fragment.arguments = bundle supportFragmentManager .beginTransaction() .replace(R.id.fragment_container, fragment) .commit() } }
AUIShortVideoListView
您可以利用短視頻列表播放View組件,構建一個沉浸式的列表播放頁面,具體調用邏輯可參考以下示例:
在 XML 布局文件中添加短劇列表播放 View 組件:
<!-- 1. Add Short Video List View Component --> <com.alivc.player.playerkits.shortvideolist.AUIShortVideoListView android:id="@+id/aui_video_list_view" android:layout_width="match_parent" android:layout_height="match_parent" />
在代碼中聲明短視頻列表播放View組件,并添加
List<VideoInfo>
數據源。Java示例
// 2. Declaration of Short Video List View private AUIShortVideoListView mShortVideoListView; mShortVideoListView = findViewById(R.id.aui_video_list_view); // 3. TODO: Retrieve data and fill it into videoInfoList List<VideoInfo> videoInfoList; // 4. Add List<VideoInfo> type data source to Short Video List View mShortVideoListView.addSources(videoInfoList); // mShortVideoListView.loadSources(videoInfoList);
Kotlin示例
// 2. Declaration of Short Video List View private lateinit var mShortVideoListView: AUIShortVideoListView mShortVideoListView = findViewById(R.id.aui_video_list_view) // 3. TODO: Retrieve data and fill it into videoInfoList val videoInfoList: List<VideoInfo> // 4. Add List<VideoInfo> type data source to Short Video List View mShortVideoListView.addSources(videoInfoList) // mShortVideoListView.loadSources(videoInfoList)
獲取數據
AUIShortVideoList 組件使用的數據結構為List<VideoInfo>
,其中VideoInfo
為存儲視頻信息的數據類,其數據結構如下:
字段 | 類型 | 釋義 | 備注 |
id | int | 視頻唯一id | 用于唯一標識每一個視頻 |
url | String | 視頻源地址 | 您可以自定義視頻源格式,如 MP4/M3U8 等 |
coverUrl | String | 視頻封面圖 | |
author | String | 視頻作者 | |
title | String | 視頻標題 | |
type | String | 視頻類型 | 參考 VideoType 枚舉,視頻源 or 廣告 |
為了確保AUIShortVideoList組件正常運行,請通過Bundle傳遞已序列化的 List<VideoInfo>
字符串,以下是示例代碼:
intent.putExtra(AUIShortVideoListView.KEY_VIDEO_INFO_LIST_DATA, videoInfoListJSON);
您可以通過網絡請求或數據轉換這兩種方式,獲取最終的List<VideoInfo>
數據源,并將其序列化為 JSON 字符串,示例如下:
網絡請求
Java示例
AUIShortVideoListUtil.requestVideoInfoList(new AUIShortVideoListUtil.OnNetworkCallBack<List<VideoInfo>>() { @Override public void onResponse(List<VideoInfo> videoInfoList) { if (videoInfoList == null || videoInfoList.isEmpty()) { // TODO: Request video info list error! return; } String videoInfoListJSON = AUIShortVideoListUtil.serializeVideoInfoListToJson(videoInfoList); // TODO: Use videoInfoList or videoInfoListJSON... } });
Kotlin示例
AUIShortVideoListUtil.requestVideoInfoList(object : AUIShortVideoListUtil.OnNetworkCallBack<List<VideoInfo?>?> { override fun onResponse(videoInfoList: List<VideoInfo?>?) { if (videoInfoList.isNullOrEmpty()) { // TODO: Request video info list error! return } val videoInfoListJSON = AUIShortVideoListUtil.serializeVideoInfoListToJson(videoInfoList) // TODO: Use videoInfoList or videoInfoListJSON... } })
數據轉換
Java示例
ArrayList<VideoInfo> videoInfoList = AUIShortVideoListUtil.assembleVideoInfoList(); if (videoInfoList == null || videoInfoList.isEmpty()) { // TODO: Assemble video info list error! return; } String videoInfoListJSON = AUIShortVideoListUtil.serializeVideoInfoListToJson(videoInfoList); // TODO: Use videoInfoList or videoInfoListJSON...
Kotlin示例
val videoInfoList = AUIShortVideoListUtil.assembleVideoInfoList() if (videoInfoList.isNullOrEmpty()) { // TODO: Assemble video info list error! return } val videoInfoListJSON = AUIShortVideoListUtil.serializeVideoInfoListToJson(videoInfoList) // TODO: Use videoInfoList or videoInfoListJSON...
集成FAQ
播放黑屏等異常情況
請檢查您的SDK License配置,詳情請參見Android端接入License。
編譯運行出現報錯
請確保模塊中的配置,如 compileSdkVersion、buildToolsVersion、minSdkVersion、targetSdkVersion等,與您的項目中的設置保持一致。
如果您的項目中已有相同第三方庫,請調整模塊中的版本號,以確保兼容性并避免沖突。
模擬器運行無法播放
Android播放器SDK不支持模擬器運行,集成完成后需要真機上進行測試。
錯誤“Namespace not specified”
請檢查您的 AGP 版本。如果為較新版本(如8.3.2),需要手動在各模塊 build.gradle 中添加 namespace 設置。舊版本 AGP 此配置位于模塊 /src/main/res/AndroidManifest.xml 中的 package 屬性。
Gradle 在處理 repository 的優先級時出現沖突
請優先在 setting.gradle 中添加 repository。
搭建場景
AUIShortVideoList組件支持低代碼集成,適用于多種場景。您可以基于此組件構建短視頻列表的場景化功能。請參考AUIPlayerScenes中的示例,例如AUIShortDramaList(短劇劇場場景化模塊)和 AUIShortDramaFeeds(短劇Feeds流場景化模塊)。
短劇劇場場景
概述
AUIShortDramaList是短劇劇場場景化模塊,基于AUIShortVideoList組件實現。模塊提供了劇場詳情頁和推薦頁,并且支持一二級頁面嵌套和播放器實例共享。
場景集成
在進行短劇劇場場景搭建之前,請確保已完成AUIShortVideoList組件的集成準備。
將AUIShortDramaList模塊拷貝到您項目工程中。
檢查AUIShortVideoList組件的依賴關系,并增加模塊引用和模塊依賴。
檢查組件依賴,請在AUIShortDramaList模塊的 build.gradle 文件中檢查AUIShortVideoList組件的依賴配置:
// 若 AUIShortVideoList 模塊位于 AUIPlayerKits 文件夾中: implementation project(':AUIPlayerKits:AUIShortVideoList') // 若 AUIShortVideoList 模塊直接放在項目根目錄: implementation project(':AUIShortVideoList')
添加模塊引用,請在項目根目錄的 settings.gradle 文件中添加以下內容:
Groovy DSL示例
// 若 AUIShortDramaList 模塊位于 AUIPlayerScenes 文件夾中: include ':AUIPlayerScenes:AUIShortDramaList' // 若 AUIShortDramaList 模塊直接放在項目根目錄: include ':AUIShortDramaList'
Kotlin DSL示例
// 若 AUIShortDramaList 模塊位于 AUIPlayerScenes 文件夾中: include(":AUIPlayerScenes:AUIShortDramaList") // 若 AUIShortDramaList 模塊直接放在項目根目錄: include(":AUIShortDramaList")
添加模塊依賴,請在 app 模塊的 build.gradle 文件中添加以下內容:
Groovy DSL示例
// 若 AUIShortDramaList 模塊位于 AUIPlayerScenes 文件夾中: implementation project(':AUIPlayerScenes:AUIShortDramaList') // 若 AUIShortDramaList 模塊直接放在項目根目錄: implementation project(':AUIShortDramaList')
Kotlin DSL示例
// 若 AUIShortDramaList 模塊位于 AUIPlayerScenes 文件夾中: implementation(project(":AUIPlayerScenes:AUIShortDramaList")) // 若 AUIShortDramaList 模塊直接放在項目根目錄: implementation(project(":AUIShortDramaList"))
編譯運行,確保組件已被正確集成。
使用方法
您可以將短劇劇場 Activity 頁面直接提供給外部進行跳轉,具體調用邏輯可參考以下示例。
Java示例
// TODO: context is android context
Intent intent = new Intent(context, AUIShortDramaListActivity.class);
startActivity(intent);
Kotlin示例
// TODO: context is android context
val intent = Intent(context, AUIShortDramaListActivity::class.java)
startActivity(intent)
獲取數據
AUIShortDramaList 模塊使用的數據結構為List<DramaInfo>
,其中 DramaInfo
為存儲短劇劇集的數據類,其數據結構如下:
字段 | 類型 | 釋義 | 備注 |
id | int | 劇集唯一id | |
title | String | 劇集標題 | |
cover | String | 劇集封面 | |
firstDrama | VideoInfo | 劇集首集 | firstDrama為 dramas 中的第一集 |
dramas | ArrayList<VideoInfo> | 劇集列表 | 可作為 AUIShortVideoList 模塊的數據源 |
您可以通過網絡請求或數據轉換這兩種方式,獲取最終的List<DramaInfo>
數據源:
網絡請求
Java示例
AUIShortDramaListUtil.requestDramaInfoList(new AUIShortVideoListUtil.OnNetworkCallBack<List<DramaInfo>>() { @Override public void onResponse(List<DramaInfo> dramaInfoList) { if (dramaInfoList == null || dramaInfoList.isEmpty()) { // TODO: Request drama info list error! return; } // TODO: Use dramaInfoList } });
Kotlin示例
AUIShortDramaListUtil.requestDramaInfoList(object : AUIShortVideoListUtil.OnNetworkCallBack<List<DramaInfo?>?> { override fun onResponse(dramaInfoList: List<DramaInfo?>?) { if (dramaInfoList.isNullOrEmpty()) { // TODO: Request drama info list error! return } // TODO: Use dramaInfoList } })
數據轉換
Java示例
ArrayList<DramaInfo> dramaInfoList = AUIShortDramaListUtil.assembleDramaInfoList(); if (dramaInfoList == null || dramaInfoList.isEmpty()) { // TODO: Assemble drama info list error! return; } // TODO: Use dramaInfoList
Kotlin示例
val dramaInfoList = AUIShortDramaListUtil.assembleDramaInfoList() if (dramaInfoList.isNullOrEmpty()) { // TODO: Assemble drama info list error! return } // TODO: Use dramaInfoList
短劇Feeds流場景
概述
AUIShortDramaFeeds是短劇 Feeds 流場景化模塊,基于AUIShortVideoList組件實現。模塊提供了Feeds流TAB頁,支持TAB頁嵌套以及上下左右滑動播放,實現了播放器實例共享。
場景集成
在進行短劇 Feeds 流場景搭建之前,請確保已完成AUIShortVideoList組件的集成準備。
將AUIShortDramaFeeds模塊拷貝到您項目工程中。
檢查AUIShortVideoList組件的依賴關系,并增加模塊引用和模塊依賴。
檢查組件依賴,請在AUIShortDramaFeeds模塊的 build.gradle 文件中檢查AUIShortVideoList組件的依賴配置:
// 若 AUIShortVideoList 模塊位于 AUIPlayerKits 文件夾中: implementation project(':AUIPlayerKits:AUIShortVideoList') // 若 AUIShortVideoList 模塊直接放在項目根目錄: implementation project(':AUIShortVideoList')
添加模塊引用,請在項目根目錄的 settings.gradle 文件中添加以下內容:
Groovy DSL示例
// 若 AUIShortDramaFeeds 模塊位于 AUIPlayerScenes 文件夾中: include ':AUIPlayerScenes:AUIShortDramaFeeds' // 若 AUIShortDramaFeeds 模塊直接放在項目根目錄: include ':AUIShortDramaFeeds'
Kotlin DSL示例
// 若 AUIShortDramaFeeds 模塊位于 AUIPlayerScenes 文件夾中: include(":AUIPlayerScenes:AUIShortDramaFeeds") // 若 AUIShortDramaFeeds 模塊直接放在項目根目錄: include(":AUIShortDramaFeeds")
添加模塊依賴,請在 app 模塊的 build.gradle 文件中添加以下內容:
Groovy DSL示例
// 若 AUIShortDramaFeeds 模塊位于 AUIPlayerScenes 文件夾中: implementation project(':AUIPlayerScenes:AUIShortDramaFeeds') // 若 AUIShortDramaFeeds 模塊直接放在項目根目錄: implementation project(':AUIShortDramaFeeds')
Kotlin DSL示例
// 若 AUIShortDramaFeeds 模塊位于 AUIPlayerScenes 文件夾中: implementation(project(":AUIPlayerScenes:AUIShortDramaFeeds")) // 若 AUIShortDramaFeeds 模塊直接放在項目根目錄: implementation(project(":AUIShortDramaFeeds"))
編譯運行,確保組件已被正確集成。
使用方法
您可以將短劇 Feeds 流 Activity 頁面直接提供給外部進行跳轉,具體調用邏輯可參考以下示例。
Java示例
// TODO: context is android context
Intent intent = new Intent(context, AUIShortDramaFeedsActivity.class);
startActivity(intent);
kotlin示例
// TODO: context is android context
val intent = Intent(context, AUIShortDramaFeedsActivity::class.java)
startActivity(intent)
獲取數據
AUIShortDramaFeeds 模塊使用的數據結構為List<VideoInfo>
,其中 VideoInfo
為存儲視頻信息的數據類;如需了解更詳細的內容,建議查閱AUIShortVideoList組件的完整文檔。
核心功能介紹
本組件功能使用阿里云播放器SDK,通過多個播放器實例(AliPlayer)+ 預加載(MediaLoader)+ 預渲染的方式進行實現,使用了預加載、預渲染、HTTPDNS、加密播放等核心能力,在播放延遲、播放穩定性及安全性方面大幅提升觀看體驗。具體介紹參考進階功能。
預加載
通過滑動窗口策略,動態啟停視頻的預加載任務。SDK底層基于網絡狀態智能調節任務優先級,以確保正播放視頻和即將播放視頻可以獲得更多的網絡資源,顯著提升視頻秒開率,減少播放卡頓。即使在快速滑動視頻時,仍然可以獲得流暢的播放體驗。更多信息,請參見預加載。
預渲染
使用預渲染的方式,在后臺提前渲染后續視頻的首幀,減少黑屏的出現,讓播放更加絲滑。音視頻終端 SDK和播放器SDK從6.16.0版本開始增添了對強制預渲染功能的支持。更多信息,請參見預渲染。
多實例播放器池
實現了全局共享的播放器實例池,可以靈活配置實例數。通過優化 API 調用和線程資源管控,確保在線程管理、CPU利用、內存占用等方面達到性能最優、資源最省,使性能和體驗達到最佳平衡。通過性能優化,減少了滑動過程中的耗時操作,減少滑動卡頓,讓播放體驗更加絲滑。
HTTPDNS
HTTPDNS可以提供更快速和穩定的DNS解析服務,通過替換傳統DNS解析,可以減少DNS解析時間,提高視頻播放的加載速度和穩定性,從而提升用戶的觀看體驗。音視頻終端SDK和播放器SDK從6.12.0版本開始無需手動開啟HTTPDNS。更多信息,請參見HTTPDNS。
視頻加密
微短劇場景的視頻通常為1~3分鐘的MP4格式視頻,音視頻終端SDK和播放器SDK從6.8.0版本開始支持MP4私有加密播放能力,為微短劇場景的視頻提供安全保障支撐。更多信息,請參見如何播放加密視頻。
經私有加密的MP4格式視頻,需滿足以下條件,才可正常播放:
經私有加密的MP4視頻傳給播放器播放時,業務側(App側)需要為視頻URL追加
etavirp_nuyila=1
,例如:原視頻URL為https://example.aliyundoc.com/test.mp4
,則需要傳給播放器播放的視頻URL為https://example.aliyundoc.com/test.mp4?etavirp_nuyila=1
。App的License對應的uid與產生私有加密MP4的uid是一致的。
如何校驗私有加密視頻是否正確,以私有加密的視頻URL為例說明如下:
meta信息里面應帶有
AliyunPrivateKeyUri
的tag。ffplay不能直接播放。
H265自適應播放
當播放H265流硬解失敗且已設置H264備流時,實現自動降級播放H264備流;若未設置H264備流,則自動降級為H265軟解播放。更多信息,請參見H265自適應播放。
自適應ABR
播放器SDK支持多碼率自適應HLS、DASH視頻流,通過調用播放器的selectTrack
方法切換播放的碼流,可以實現網絡自適應切換視頻清晰度的功能。更多信息,請參見自網絡自適應切換。
防錄屏
防錄屏通過監聽錄屏和截屏行為及時阻斷播放進程,有效保護視頻內容的版權,防止未經授權的盜錄和傳播。
// Android特有功能,禁止app錄屏和截屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);