集成微短剧方案-Android

本文介绍Android端集成微短剧项目的操作步骤。

源码说明

源码下载

如需获取源码详情,请提交方案咨询

环境要求

类别

要求

开发环境

建议使用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真机上,运行微短剧应用。

集成组件

以下是 AUIShortVideoList 组件的使用方法及其对外接口的详细介绍,旨在实现短视频列表播放功能。

集成准备

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

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

  2. AUIShortVideoList模块拷贝到您项目工程中。

  3. 在项目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")
    }
  4. 增加模块引用方式和依赖方式。

    • 添加模块引用,请在项目根目录的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"))
  5. 编译运行,确保组件已被正确集成。

    说明
    1. 集成完成后,建议执行一次git commit,提交记录当前组件最新的 commit ID。这为将来的组件更新提供重要的追溯依据,也记录了组件更新前后的代码差异,有效把控集成准入质量。同时还可以在寻求技术支持时快速定位组件版本,从而提高技术支持的效率。

    2. 集成问题详见集成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页面中进行使用,具体调用逻辑可参考以下示例:

    1. 在XML布局文件中添加FrameLayout,用于承载Fragment:

      <FrameLayout
          android:id="@+id/fragment_container"
          android:layout_width="match_parent"
          android:layout_height="match_parent" />
    2. 在代码中初始化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组件,构建一个沉浸式的列表播放页面,具体调用逻辑可参考以下示例:

    1. 在 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" />
    2. 在代码中声明短视频列表播放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

编译运行出现报错

  1. 请确保模块中的配置,如 compileSdkVersionbuildToolsVersionminSdkVersiontargetSdkVersion等,与您的项目中的设置保持一致。

  2. 如果您的项目中已有相同第三方库,请调整模块中的版本号,以确保兼容性并避免冲突。

模拟器运行无法播放

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组件的集成准备。

  1. AUIShortDramaList模块拷贝到您项目工程中。

  2. 检查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"))
  3. 编译运行,确保组件已被正确集成。

使用方法

您可以将短剧剧场 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组件的集成准备。

  1. AUIShortDramaFeeds模块拷贝到您项目工程中。

  2. 检查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"))
  3. 编译运行,确保组件已被正确集成。

使用方法

您可以将短剧 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);

用户指引

播放器SDK

音视频终端SDK

阿里云·视频点播

视频点播控制台

ApsaraVideo VOD