Android端集成

本文介绍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端集成1.png

环境要求

类别

要求

开发环境

建议使用Android Studio 4.0及以上版本。

系统版本

Android 5.0(SDK API Level 21)及以上版本。

其他

Android 5.0及以上版本的真机,暂不支持模拟器调试。

前提条件

您已获取音视频终端SDK的播放器的License授权和License Key。在选择SDK应用场景时选择音视频播放,获取的详细步骤请参见申请License

image

跑通Demo

  1. 下载Demo源码,在Android Studio中打开项目。

  2. 前提条件中获取的License文件放到assets/cert目录下。

  3. 打开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="" />
  4. 真机测试

    1. 链接Android真机,连接成功后显示如下图。image.png

    2. 单击下图绿色运行按钮,构建工程文件。image.png

    3. 安装到Android真机上,运行微短剧应用。

编译运行

  1. 接入已授权播放器的音视频终端SDK License。

    具体操作,请参见Android端接入License

  2. 将AUIVideoEpisode模块,及其依赖的模块拷贝到您的项目工程中。

    工程地址:AUIVideoList

  3. 修改您项目工程的引入方式。

    请根据您自身业务需求进行集成AUIVideoEpisode等模块。

配置基础功能

  1. 设置微短剧入口页面。

    在当前页面中打开短剧主界面AUIEpisodePlayerActivity。

    Intent videoListIntent = new Intent(this, AUIEpisodePlayerActivity.class);
    startActivity(videoListIntent);
  2. 加载剧集数据。

    本组件默认使用了内置的剧集数据进行演示,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

      分享数。

  3. 开发视频互动功能。

    源码中,点赞、评论、分享仅在视频上透出入口,点击后具体的操作需要由您自行实现,可以通过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);