本文介绍Android端集成微短剧项目的操作步骤。
源码说明
源码下载
下载地址请参见GitHub开源项目:AUI Kits微短剧场景(Android端)
源码结构
└── videoepisode # 短剧根目录
├── AUIEpisodePlayerActivity.java # 短剧页面
├── AUIVideoEpisodeController.java # 短剧页面控制器
├── adapter # 适配器根目录
│ ├── AUIEpisodePanelAdapter.java # 短剧面板适配器
│ └── AUIVideoEpisodeAdapter.java # 短剧视频页面适配器
├── annotation # 枚举类目录
│ └── PreRenderPlayerState.java # 预渲染状态枚举
├── component # 页面组件目录
│ ├── AUIEpisodeBarComponent.java # 短剧页面底部bar组件
│ ├── AUIEpisodePanelComponent.java # 短剧选集列表组件
│ ├── AUIVideoDetailComponent.java # Feed流页面详情组件(用户名、视频详情)
│ └── AUIVideoInteractiveComponent.java # Feed流页面交互组件(点赞、评论、分享)
├── data # 数据结构目录
│ ├── AUIEpisodeConstants.java # 短剧常量类
│ ├── AUIEpisodeData.java # 短剧剧集数据结构
│ ├── AUIEpisodeDataEvent.java # 短剧剧集更新事件
│ └── AUIEpisodeVideoInfo.java # 短剧单集视频数据
├── listener # 回调与监听目录
│ ├── OnDetailEventListener.java # Feed流页面详情组件回调事件
│ ├── OnInteractiveEventListener.java # Feed流页面交互组件回调事件
│ ├── OnPanelEventListener.java # 短剧选集列表组件回调事件
│ └── OnSurfaceListener.java # 短剧视频页面Surface状态回调事件
└── view # 视图目录
├── AUIVideoEpisodeLayoutManager.java # 短剧Feed流上下滑页面骨架控制器
└── AUIVideoEpisodeListView.java # 短剧Feed流上下滑页面骨架
架构设计
环境要求
类别 | 要求 | ||||||
开发环境 | 建议使用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真机上,运行微短剧应用。
编译运行
接入已授权播放器的音视频终端SDK License。
具体操作,请参见Android端接入License。
将AUIVideoEpisode模块,及其依赖的模块拷贝到您的项目工程中。
工程地址:AUIVideoList
修改您项目工程的引入方式。
请根据您自身业务需求进行集成AUIVideoEpisode等模块。
配置基础功能
设置微短剧入口页面。
在当前页面中打开短剧主界面AUIEpisodePlayerActivity。
Intent videoListIntent = new Intent(this, AUIEpisodePlayerActivity.class); startActivity(videoListIntent);
加载剧集数据。
本组件默认使用了内置的剧集数据进行演示,mock数据取自网页json,参考常量
EPISODE_JSON_URL
。在您集成组件后需要修改此部分的逻辑,对接到您的服务端,通过服务端提供的接口来获取剧集数据。private final AUIVideoListViewModel.DataProvider<AUIEpisodeData> dataProvider = new AUIVideoListViewModel.DataProvider<AUIEpisodeData>() { @Override public void onLoadData(AUIVideoListViewModel.DataCallback<AUIEpisodeData> callback) { new Thread(new Runnable() { @Override public void run() { if (callback != null) { callback.onData(loadDataFromJson()); } } }).start(); } };
从服务端获取到的剧集数据,需要根据数据协议转换为剧集模型。剧集模型字段说明如下:
短剧剧集:AUIEpisodeData
字段
含义
id
短剧剧集唯一ID。
title
短剧剧集名称。
list
短剧剧集视频列表。
单集视频:AUIEpisodeVideoInfo
继承自基类
VideoInfo
,新增likeCount(点赞数)、commentCount(评论数)、shareCount(分享数)字段。字段
含义
videoId
视频ID,是视频的唯一标识。
url
播放源URL。
videoDuration
时长。
coverUrl
封面。
author
作者。
title
标题。
videoPlayCount
播放次数。
likeCount
点赞数。
commentCount
评论数。
shareCount
分享数。
开发视频互动功能。
源码中,点赞、评论、分享仅在视频上透出入口,点击后具体的操作需要由您自行实现,可以通过AUIVideoEpisodeListView类进行对接和设置。
episodeAdapter.initInteractiveEventListener(new OnInteractiveEventListener() { @Override public void onClickLike(AUIEpisodeVideoInfo episodeVideoInfo, boolean isSelected) { // 请求点赞API... } @Override public void onClickComment(AUIEpisodeVideoInfo episodeVideoInfo) { // 请求评论API... } @Override public void onClickShare(AUIEpisodeVideoInfo episodeVideoInfo) { // 请求分享API... } });
核心功能介绍
本组件功能通过阿里云播放器SDK的AliListPlayer实现。它利用本地缓存、智能预加载和智能预渲染等核心能力,显著降低了播放延迟并提高了播放稳定性,从而提升用户观看体验。
本地缓存
本地缓存可以提高微短剧视频播放的加载速度和稳定性,使用户在网络不稳定或者断网的情况下依然能够流畅观看视频,提升用户的观看体验。更多信息,请参见本地缓存。
// 开启本地缓存
public void enableLocalCache(boolean enable, String path) {
AliPlayerGlobalSettings.enableLocalCache(enable, 10 * 1024, path);
PlayerConfig config = aliListPlayer.getConfig();
config.mEnableLocalCache = enable;
aliListPlayer.setConfig(config);
}
// 设置缓存清除策略
public void setCacheFileClearConfig(long expireMin, long maxCapacityMB, long freeStorageMB) {
AliPlayerGlobalSettings.setCacheFileClearConfig(expireMin, maxCapacityMB, freeStorageMB);
}
// 清除缓存
public void clearCache() {
AliPlayerGlobalSettings.clearCaches();
}
智能预加载
智能预加载可以提前加载视频数据,使视频播放更加流畅,减少加载等待时间,提升用户的观看体验。更多信息,请参见预加载。
// 设置预加载数量
public void setPreloadCount(int preloadCount) {
aliListPlayer.setPreloadCount(preloadCount);
}
// 设置智能预加载策略
public void setPreloadStrategy(boolean enable, String params) {
aliListPlayer.setPreloadScene(IListPlayer.SceneType.SCENE_SHORT);
aliListPlayer.enablePreloadStrategy(IListPlayer.StrategyType.STRATEGY_DYNAMIC_PRELOAD_DURATION, enable);
if (enable) {
aliListPlayer.setPreloadStrategy(IListPlayer.StrategyType.STRATEGY_DYNAMIC_PRELOAD_DURATION, params);
}
}
智能预渲染
智能预渲染可以减少视频播放的启动延迟,让用户更快地看到画面,提升视频播放的加载速度和观看体验。更多信息,请参见预渲染。
// 设置智能预渲染
// 备注:当前版本,PreRender Player仅支持预渲染列表下一个视频的画面;指定预渲染上一个视频的画面,有待后续版本支持。
public void setSurfaceToPreRenderPlayer(Surface surface) {
preRenderPlayer = aliListPlayer.getPreRenderPlayer();
if (preRenderPlayer != null) {
preRenderPlayer.setOnRenderingStartListener(() -> {
mCurrentPreRenderPlayerState = PreRenderPlayerState.FIRST_FRAME_RENDERED;
});
preRenderPlayer.setSurface(surface);
if (mNeedPreRender && surface != null) {
//RenderingStart前一直尝试刷新
preRenderPlayer.seekTo(0);
if (mCurrentPreRenderPlayerState == PreRenderPlayerState.FIRST_FRAME_RENDERED) {
mNeedPreRender = false;
}
}
} else {
aliListPlayer.clearScreen();
aliListPlayer.setSurface(surface);
}
}
HTTPDNS
HTTPDNS可以提供更快速和稳定的DNS解析服务,通过替换传统DNS解析,可以减少DNS解析时间,提高视频播放的加载速度和稳定性,从而提升用户的观看体验。更多信息,请参见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不能直接播放。
防录屏
防录屏通过监听录屏和截屏行为及时阻断播放进程,有效保护视频内容的版权,防止未经授权的盗录和传播。
// Android特有功能,禁止app录屏和截屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);