SDK建议使用Android 5.0(API Level 21)及以上系统
以下是 SDK 的开发环境,App 开发环境不需要与 SDK 一致,但要保证兼容:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
// 导入短视频 SDK aar,LiteAVSDK_UGC_x.y.zzzz 请自行修改为最新版本号
compile(name: 'LiteAVSDK_UGC_10.7.1136', ext: 'aar')
...
}
allprojects {
repositories {
jcenter()
flatDir {
dirs 'libs'
}
}
}
defaultConfig {
...
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
在 AndroidManifest.xml 中配置 App 的权限,音视频类 App 一般需要以下权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.Camera"/>
<uses-feature android:name="android.hardware.camera.autofocus" />
- Application onCreate()
中进行如下设置:public class DemoApplication extends Application {
String ugcLicenceUrl = ""; // 填入您从控制台申请的 licence url
String ugcKey = ""; // 填入您从控制台申请的 licence key
@Override
public void onCreate() {
super.onCreate();
TXUGCBase.getInstance().setLicence(instance, ugcLicenceUrl, ugcKey);
}
}
说明:对于使用4.7版本 License 的用户,如果您升级了 SDK 到4.9版本,您可以登录控制台,单击下图的切换到新版 License 按钮生成对应的 License Key 和 License URL,切换后的 License 必须使用4.9及更高的版本,切换后按照上述操作集成即可。
在 TXLiveBase 中可以设置 log 是否在控制台打印以及 log 的级别,具体代码如下:
TXLiveBase.setConsoleEnabled(true);
TXLiveBase.setLogLevel(TXLiveConstants.LOG_LEVEL_DEBUG);
在工程中调用 SDK 接口,获取 SDK 版本信息,以验证工程配置是否正确。
引用 SDK:
在 MainActivity.java 中引用 SDK 的 class:
import com.tencent.rtmp.TXLiveBase;
调用接口:
在 onCreate 中调用 getSDKVersioin 接口获取版本号:
String sdkver = TXLiveBase.getSDKVersionStr();
Log.d("liteavsdk", "liteav sdk version is : " + sdkver);
编译运行:
如果前面各步骤都操作正确,Demo工程将顺利编译通过,运行之后将在 logcat 中看到如下 log 信息:09-26 19:30:36.547 19577-19577/ D/liteavsdk: liteav sdk version is : 7.4.9211
如果您将 SDK 导入到您的工程,编译运行出现类似以下错误:
Caused by: android.view.InflateException:
Binary XML file #14:Error inflating class com.tencent.rtmp.ui.TXCloudVideoView
可以按照以下流程来排查问题:
确认是否已经将 SDK 中的 jar 包和 so 库放在 jniLibs目录下。
如果您使用 aar 集成方式的完整版本,在工程目录下的 build.gradle 的 defaultConfig 里面确认下是否将 x64 架构的 so 库过滤掉。
defaultConfig {
...
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
检查下混淆规则,确认已将 SDK 的相关包名加入了不混淆名单。
-keep class com.tencent.** { *; }
配置 App 打包参数。
下述内容主要讲解如何在已有的项目中快速集成短视频 SDK,完成从录制,编辑,合成的完整过程。文中所需要的代码及资源文件均在 资源下载 中 SDK 的压缩包中以及 短视频 Demo 提供。
创建一个空的 Android Studio 工程,工程名可以为 ugc
,包名可自定义,保证新建的空工程编译通过。
配置 Project 的 build.gradle
。
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
# 拷贝开始
classpath 'com.android.tools.build:gradle:3.6.1'
# 拷贝结束
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
# 拷贝开始
flatDir {
dirs 'src/main/jniLibs'
dirs project(':ugckit').file('libs')
}
# 拷贝结束
jcenter() // Warning: this repository is going to shut down soon
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
# 拷贝开始
ext {
compileSdkVersion = 29
buildToolsVersion = "29.0.2"
supportSdkVersion = "26.1.0"
minSdkVersion = 21
targetSdkVersion = 26
versionCode = 1
versionName = "v1.1"
proguard = true
rootPrj = "$projectDir/.."
ndkAbi = 'armeabi-v7a'
liteavSdk = "com.tencent.liteav:LiteAVSDK_UGC:latest.release"
}
# 拷贝结束
配置 app 的 build.gradle 。
plugins {
id 'com.android.application'
}
android {
# 拷贝开始
compileSdkVersion = rootProject.ext.compileSdkVersion
buildToolsVersion = rootProject.ext.buildToolsVersion
# 拷贝结束
defaultConfig {
applicationId "com.yunxiao.dev.liteavdemo"
# 拷贝开始
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName
renderscriptTargetApi = 19
renderscriptSupportModeEnabled = true
multiDexEnabled = true
ndk {
abiFilters rootProject.ext.ndkAbi
}
# 拷贝结束
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
# 拷贝开始
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'com.google.code.gson:gson:2.3.1'
implementation 'com.tencent.rqd:crashreport:3.4.4'
implementation 'com.tencent.rqd:nativecrashreport:3.9.2'
implementation 'com.github.castorflex.verticalviewpager:library:19.0.1'
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'de.hdodenhof:circleimageview:3.1.0'
implementation rootProject.ext.liteavSdk
implementation project(':ugckit')
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
implementation('com.blankj:utilcode:1.25.9', {
exclude group: 'com.google.code.gson', module: 'gson'
})
# 拷贝结束
}
配置 Gradle 版本:
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
拷贝 ugckit module
到 您新建的工程 ugc 目录下。
如何集成基础美颜,拷贝 beautysettingkit module
到您新建的工程 ugc 目录下。
如何集成腾讯特效,拷贝 xmagickit module
到您新建的工程 ugc 目录下,参考文档。
在工程的 settings.gradle
中导入 ugckit。
在新建的工程 UGC/settings.gradle
下指明引入这几个 module:
include ':ugckit'
include ':beautysettingkit'
include ':xmagickit'
在工程 app module 中依赖 UGCKit module:
implementation project(':ugckit')
设置 Licence,初始化 UGCKit
在您使用短视频功能之前尽可能早的设置 Licence,初始化 UGCKit。
// 设置Licence
TXUGCBase.getInstance().setLicence(this, ugcLicenceUrl, ugcKey);
// 初始化UGCKit
UGCKit.init(this);
新建录制 xml, 加入如下配置:
<com.tencent.qcloud.ugckit.UGCKitVideoRecord
android:id="@+id/video_record_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" />
在 res/values/styles.xml
中新建空的录制主题,继承 UGCKit 默认录制主题。
<style name="RecordActivityTheme" parent="UGCKitRecordStyle"/>
新建录制 Activity ,继承 FragmentActivity
,实现接口 ActivityCompat.OnRequestPermissionsResultCallback
,获取 UGCKitVideoRecord 对象并设置回调方法。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 必须在代码中设置主题(setTheme)或者在AndroidManifest中设置主题(android:theme)
setTheme(R.style.RecordActivityTheme);
setContentView(R.layout.activity_video_record);
// 获取UGCKitVideoRecord
mUGCKitVideoRecord = (UGCKitVideoRecord) findViewById(R.id.video_record_layout);
// 设置录制监听
mUGCKitVideoRecord.setOnRecordListener(new IVideoRecordKit.OnRecordListener() {
@Override
public void onRecordCanceled() {
// 录制被取消
}
@Override
public void onRecordCompleted(UGCKitResult result) {
// 录制完成回调
}
});
}
@Override
protected void onStart() {
super.onStart();
// 判断是否开启了“相机”和“录音权限”(如何判断权限,参考Github/Demo示例)
if (hasPermission()) {
// UGCKit接管录制的生命周期(关于更多UGCKit接管录制生命周期的方法,参考Github/Demo示例)
mUGCKitVideoRecord.start();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (grantResults != null && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
mUGCKitVideoRecord.start();
}
}
<com.tencent.qcloud.ugckit.UGCKitVideoPicker
android:id="@+id/video_picker"
android:layout_width="match_parent"
android:layout_height="match_parent" />
res/values/styles.xml
中新建空的主题,继承 UGCKit 默认视频导入主题。<style name="PickerActivityTheme" parent="UGCKitPickerStyle"/>
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
// 必须在代码中设置主题(setTheme)或者在AndroidManifest中设置主题(android:theme)
setTheme(R.style.PickerActivityTheme);
setContentView(R.layout.activity_video_picker);
// 获取UGCKitVideoPicker
mUGCKitVideoPicker = (UGCKitVideoPicker) findViewById(R.id.video_picker);
// 设置视频选择监听
mUGCKitVideoPicker.setOnPickerListener(new IPickerLayout.OnPickerListener() {
@Override
public void onPickedList(ArrayList<TCVideoFileInfo> list) {
// UGCKit返回选择的视频路径集合
}
});
}
<com.tencent.qcloud.ugckit.UGCKitVideoCut
android:id="@+id/video_cutter"
android:layout_width="match_parent"
android:layout_height="match_parent" />
res/values/styles.xml
中新建空的主题,继承 UGCKit 默认编辑主题。<style name="EditerActivityTheme" parent="UGCKitEditerStyle"/>
FragmentActivity
,获取 UGCKitVideoCut 对象,并设置回调方法。@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 必须在代码中设置主题(setTheme)或者在AndroidManifest中设置主题(android:theme)
setTheme(R.style.EditerActivityTheme);
setContentView(R.layout.activity_video_cut);
mUGCKitVideoCut = (UGCKitVideoCut) findViewById(R.id.video_cutter);
// 获取上一个界面视频导入传过来的视频源路径
mVideoPath = getIntent().getStringExtra(UGCKitConstants.VIDEO_PATH);
// UGCKit设置视频源路径
mUGCKitVideoCut.setVideoPath(mVideoPath);
// 设置视频生成的监听
mUGCKitVideoCut.setOnCutListener(new IVideoCutKit.OnCutListener() {
@Override
public void onCutterCompleted(UGCKitResult ugcKitResult) {
// 视频裁剪进度条执行完成后调用
}
@Override
public void onCutterCanceled() {
// 取消裁剪时被调用
}
});
}
@Override
protected void onResume() {
super.onResume();
// UGCKit接管裁剪界面的生命周期(关于更多UGCKit接管裁剪生命周期的方法,参考Github/Demo示例)
mUGCKitVideoCut.startPlay();
}
<com.tencent.qcloud.ugckit.UGCKitVideoEdit
android:id="@+id/video_edit"
android:layout_width="match_parent"
android:layout_height="match_parent" />
FragmentActivity
,获取 UGCKitVideoEdit 对象并设置回调方法 。@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 必须在代码中设置主题(setTheme)或者在AndroidManifest中设置主题(android:theme)
setTheme(R.style.EditerActivityTheme);
setContentView(R.layout.activity_video_editer);
// 设置视频源路径(非必须,如果上个界面是裁剪界面,且设置setVideoEditFlag(true)则可以不用设置视频源)
mVideoPath = getIntent().getStringExtra(UGCKitConstants.VIDEO_PATH);
mUGCKitVideoEdit = (UGCKitVideoEdit) findViewById(R.id.video_edit);
if (!TextUtils.isEmpty(mVideoPath)) {
mUGCKitVideoEdit.setVideoPath(mVideoPath);
}
// 初始化播放器
mUGCKitVideoEdit.initPlayer();
mUGCKitVideoEdit.setOnVideoEditListener(new IVideoEditKit.OnEditListener() {
@Override
public void onEditCompleted(UGCKitResult ugcKitResult) {
// 视频编辑完成
}
@Override
public void onEditCanceled() {
}
});
}
@Override
protected void onResume() {
super.onResume();
// UGCKit接管编辑界面的生命周期(关于更多UGCKit接管编辑生命周期的方法,参考Github/Demo示例)
mUGCKitVideoEdit.start();
}
效果如下:
以下为各模块的详细说明:
UGCKit 最新版本已经使用了AndroidX,如果您使用的还是基于Support包的UGCKit,可以更新到最新版本,也可以按照以下步骤切换到AndroidX:为了方便说明,以腾讯云 UGSVSDK 为例,此 Demo 中同样使用了 UGCKit 模块。
报错信息:
ERROR: Unable to find method 'org.gradle.api.tasks.compile.CompileOptions.setBootClasspath(Ljava/lang/String;)V'.
Possible causes for this unexpected error include:
问题原因:UGCKit 使用的 Gradle 插件版本为 2.2.3 ,Gradle版本为 3.3。
解决方法:请检查 Android Studio Gradle
插件版本和 Gradle 版本是否匹配,具体请参见 查看 Gradle 插件对应Gradle版本。
ugckit module
缺少 renderscript-v8.jar
。这个库主要是对图形的处理,模糊,渲染。renderscript-v8.jar
包的目录在 \sdk\build-tools\
里,您需在 ugckit module
下新建一个 libs 包,然后将 renderscript-v8.jar
加入 libs 包即可。
本页内容是否解决了您的问题?