You need to enable JavaScript to run this app.
导航

【Android】剪同款 含 UI 接入文档

最近更新时间2023.02.06 10:39:33

首次发布时间2023.02.06 10:39:33

  1. 前提条件
  • 支持Android 5.0或以上的设备,暂不支持模拟器调试

  • 确保申请到有效的License,audiotoken,audioappkey

  • 确保申请到Maven仓库的账号密码:获取方法请联系和您对接的技术支持经理

  1. 运行环境
Gradle:6.7.1
Android Gradle Plugin:com.android.tools.build:gradle:4.1.3
kotlin: 1.5.30

minSdkVersion: 21
targetSdkVersion: 30
compileSdkVersion: 30
  1. 相关SDK介绍
NameCoordinate说明
VESDKcom.bytedance.ugc.framework.libs:vesdk音视频剪辑SDK,负责音视频渲染

NLE SDK

com.volcengine.ck.nle:NLEMediaPublic

非线性编辑中间件SDK。一套音视频编辑API
但是不负责实际的音视频渲染与上屏,音视频渲染流程由VESDK完成

CutSame SDKcom.volcengine.ck.cutsame:CK-CutSameIF剪同款模版消费SDK,负责模版的重演,更新,合成能力。
CutSameConsumercom.volcengine.ck.cutsame:CutSameConsumer剪同款模版协议转化SDK。

SDK版本号详情见 CKOne SDK 版本管理

  1. 工程介绍
  2. 目录介绍

.
├── app
├── business
├── editor-res    (内置基础剪辑SDK所需要的资源)
├── record-res    (内置的拍摄页面所需要的资源:贴纸,滤镜,美颜资源等)
├── draft         (草稿箱模块)
├── gradle
├── gradle-config
│   ├── include_source.gradle(快速include所有的module,配置在setting.gradle中)
│   └── version.gradle (声明所有依赖版本号,会在构建时进行force)
├── module_api    (各个模块API层代码)
│   └── cutsame-api
├── module_business
│   ├── cutsame   (剪同款部分SampleCode)
│       ├── CutSameUIIF   (剪同款UISampleCode)
│       ├── data-convert   (剪同款,拍摄数据转化部分,如果没有接入拍摄部分不需要该部分代码)
│       └── small-window   (剪同款,拍摄页面的小窗UISampleCode,如果没有接入拍摄部分不需要该部分代码)
│   ├── editor    (剪辑部分SampleCode)
│   └── recorder  (拍摄部分SampleCode)
├── build.gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── dependency-lock.json (用于声明所有module的json文件)
├── settings.gradle
  1. Gradle脚本配置

源码接入前需要先配置version.gradle文件,用于统一定义SampleCode使用到的依赖
version.gradle存放于gradle-config文件夹

version.gradle

  1. 资源模块

editor-res

LocalResourceSampleCode自带的默认资源,未进行加密,可以随意使用

resource

剪辑SDK各种功能所需要的资源,像文字贴纸,滤镜,特效,蒙版等,
需要更换成您自己购买的资源

editor-res 目录介绍
.
├── ModelResource.bundle     色度抠图,抠像等功能需要的算法模型文件
├── adjust.bundle           【调节】
├── bubble.bundle           【文字】->【添加文字】->【气泡】
├── canvas.bundle           【画布】->【画布样式】
├── chroma.bundle           【剪辑】->【色度抠图】
├── curve_speed.bundle      【剪辑】->【速度】->【曲线变速】
├── flower.bundle           【文字】->【添加文字】->【花字】
├── mix.bundle              【剪辑】->【混合模式】
├── sticker.bundle          【贴纸】
├── sticker_animation.bundle【贴纸】->【动画】
├── text_align.bundle       【未使用】
├── text_animation.bundle   【文字】->【添加文字】->【动画】
├── text_color.bundle       【文字】->【添加文字】->【颜色】
├── text_fonts.bundle       【文字】->【添加文字】->【字体】
├── text_style.bundle       【文字】->【添加文字】->【样式】
├── text_template.bundle    【文字】->【文字模板】
├── tone.bundle             【音频】->【变声】
├── transitions.bundle      【转场】
├── ve_effect.bundle        【特效】
├── ve_filter.bundle        【滤镜】
├── video_animation.bundle  【剪辑】->【动画】
└── video_mask.bundle       【剪辑】->【蒙版】

record-res

ComposeMakeup.bundle美颜美妆资源
duet.bundle【首页】->【合拍】所需合拍资源
FilterResource.bundle【拍摄】->【滤镜】所需滤镜资源
ModelResource.bundle特效算法模型文件
StickerResource.bundle【拍摄】->【道具】所需贴纸资源
  1. 源码模块

每个模块的SampleCode是由1个api module + N个 business module 组成
如果您想复用的我们的SampleCode

  • api层的module需要都Copy过去(api层只有接口定义,没有任何实际的业务逻辑)

  • business module您可以按需要进行Copy

  1. gradle.properties文件

字段说明

android.useAndroidX=true android.enableJetifier=trueGradle配置,使用AndroidX系列SDK
NLE_VERSIONNLE SDK版本号定义
VESDK_VERSIONVESDK 版本号定义
CUTSAME_IF_VERSION剪同款SDK 版本号定义

VERSION_CODE
VERSION_NAME

CKOne的version code 和 version name,可以不关注

MAVEN_USER_NAME MAVEN_PASS_WORDmaven仓库的账号和密码声明,您需要这个账号密码才能拉取到我们的SDK,可以联系您的技术支持经理获取
  1. 剪同款集成介绍
  2. Copy代码

  • module_business下的cutsame模块代码Copy到您的项目中,需要保持和Demo中的路径一致,选择素材流程如果没有拍摄部分,不需要data-convert和small-window这两部分代码。

  • module_business下的recorder模块代码Copy到您的项目中,需要保持和Demo中的路径一致。选择素材流程如果没有拍摄部分,忽略这部分操作。

  • 将module_api下的代码Copy到您的项目中,需要保持和Demo中的路径一致

  • copy资源模块,将recorder-rescopy到您的项目中,并替换成您自己的资源。选择素材流程如果没有拍摄部分,忽略这部分操作。

  • 复制脚本

    • 将gradle-config下的version.gradle脚本copy至您的项目并apply
  • 复制鉴权文件

    将剪同款鉴权文件(带有“union”的文件)copy到您任意module的assset目录下
      存放路径:resource/LicenseBag.bundle/yourLicenseFile(在ThrallCutSameInit类中会寻找这个路径下的授权文件)

鉴权文件存放位置必须严格按照约定的格式

  1. 配置脚本

配置settings.gradle

参考以下settings.gradle文件

暂时无法在飞书文档外展示此内容

include ':record-res'

include ':res-manager'
project(":res-manager").projectDir = new File(rootDir, "module_business/recorder/res-manager")

include ':verecorder'
project(":verecorder").projectDir = new File(rootDir, "module_business/recorder/verecorder")

include ':CutSameUIIF'
project(":CutSameUIIF").projectDir = new File(rootDir, "module_business/cutsame/CutSameUIIF")

include ':cutsame-api'
project(":cutsame-api").projectDir = new File(rootDir, "module_api/cutsame-api")

include ':data-convert'
project(":data-convert").projectDir = new File(rootDir, "module_business/cutsame/data-convert")

include ':small-window'
project(":small-window").projectDir = new File(rootDir, "module_business/cutsame/small-window")

项目根目录build.gradle配置

  • 将下面build.gradle的配置添加至您的项目
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    //【必须】添加version.gradle
    apply from: rootProject.file("gradle-config/version.gradle")
    repositories {
        google()
        mavenCentral()
        maven {  url 'https://artifact.bytedance.com/repository/Volcengine/' }
        }
    dependencies {
        classpath "com.android.tools.build:gradle:4.1.3"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "com.bytedance.news.common:service-manager-plugin:1.1.0.5-alpha.0"
    }
}

//【必须】必须添加这行脚本
apply from: 'https://ve-vos.volccdn.com/ckone/ckone_integration.gradle'

allprojects {
    repositories {
        google()
        mavenCentral()
        maven {  url "https://maven.aliyun.com/repository/public" }
        }
}

配置gradle.properties

#配置Maven库的账号密码,用于拉取SDK,账号密码不用加引号
MAVEN_USER_NAME=your user_name
MAVEN_PASS_WORD=your password

#配置相关SDK的版本,按需替换以下版本号。
NLE_VERSION=4.0.0
VESDK_VERSION=11.8.1.16-release-tob
CUTSAME_IF_VERSION=4.0.0

#鉴权文件名称,ThrallCutSameInit类通过文件名找到该文件
cutSameLicenseName="xxxxxxxxxunion.licbag"

添加依赖

implementation project(':cutsame-api')
//录制资源模块【可选】
implementation project(':record-res')
//依赖拍摄部分【可选】
implementation project(':verecorder')
//依赖剪同款部分
implementation project(':CutSameUIIF')
//retrofit2  CutSame SDK内部用到
implementation 'com.squareup.retrofit2:retrofit:2.9.0'

至此,源码集成工作结束,下面是SDK初始化配置

  1. 初始化

在项目的Application或者剪同款功能入口使用ServiceManager.getService(ICutSameExternalService::class.java)?.initCutSame(AppSingleton.instance as Application),完成初始化工作。需要修改ThrallCutSameInit.initCutSame里的相关配置。

//通过ICutSameExternalService的实现方CutsameExternalServiceImpl完成初始化。
ServiceManager.getService(ICutSameExternalService::class.java)?.initCutSame(AppSingleton.instance as Application)。

CutsameExternalServiceImpl的initCutSame方法里调用ThrallCutSameInit的initCutSame()方法。

//修改ThrallCutSameInit的initCutSame()的相关配置信息。

//默认的日志对象
val logWrapper = LogWrapper().apply {
    val logWrapper = LogWrapper().apply  {
    init(
        logConfig = LogConfig.Builder()
            .logcatLevel(LogIF.LOG_LEVER.DEBUG) //控制台输出级别
            .localLevel(LogIF.LOG_LEVER.WARNING) //本地文件输出级别
            .toLocal(true) //本地文件输出开关
            .toLogcat(true) //控制台输出开关
            .showThreadInfo(true) //显示线程信息
            .localPath(Environment.getExternalStorageDirectory().absolutePath) //本地输出文件路径
            .build()
    )
}
}
//设置log接口,可自行实现LogIF接口。
CutSameSolution.setLogIf(logWrapper)
CutSameSolution.init(
    context = this,
    //authorityConfig: 鉴权配置
    authorityConfig = AuthorityConfig.Builder()
        .licensePath(getLicenseFilePath()) //鉴权文件本地路径
        .audioAppKey("xxxx") //audio鉴权key
        .audioToken("xxxx")  //audio鉴权token
        .authorityListener(object : AuthorityConfig.AuthorityListener {
            override fun onError(errorCode: Int, errorMsg: String) {
                Log.d(TAG, "onError $errorCode $errorMsg")
            }
        }).build(),
   //templateFetcherConfig: 模版拉取配置。如果不是使用CutSameSDK拉取模版数据,则不需要配置。
    templateFetcherConfig = TemplateFetcherConfig.Builder()
        .host("http://xx.xxxx.net")
        .build(),
    //effectFetcherConfig: 特效拉取配置
    effectFetcherConfig = EffectFetcherConfig.Builder()
        .host("http://xx.xxxx.net")
        .effectLitPath("/xxx/xxxx")
        .localModelPath("xxxxxx") //本地算法模型绝对路径,拍摄相关道具需要使用,智能抠像能力消费需要使用。
        .build()
)
  1. 唤起模版列表页面。

//唤起模版列表,获取到Intent
ServiceManager.getService(ICutSameExternalService::class.java)?.getTemplateUIIntent(context)
  1. 混淆相关
  • 如果业务上的release包开启了混淆,需要添加如下混淆规则

暂时无法在飞书文档外展示此内容