集成微短剧方案-Android

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

源码说明

源码下载

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

环境要求

类别

要求

开发环境

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

系统版本

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

其他

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

前提条件

您已获取音视频终端SDK的播放器的License授权证书和License Key,获取的详细步骤请参见申请License

8DCDA3B8-4BF9-43FD-A91D-4CEB8A5A5C93.png

跑通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