本文介绍Android端集成微短剧项目的操作步骤。
源码说明
源码下载
如需获取源码详情,请提交方案咨询。
环境要求
类别 | 要求 | ||||||
开发环境 | 建议使用Android Studio 4.0及以上版本。 | ||||||
系统版本 | Android 5.0(SDK API Level 21)及以上版本。 | ||||||
其他 | Android 5.0及以上版本的真机,暂不支持模拟器调试。 |
前提条件
您已获取音视频终端SDK的播放器的License授权和License Key。在选择SDK应用场景时选择音视频播放,获取的详细步骤请参见申请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);