您可以依据以下步骤将 TuSDKVideo 集成到您的目标项目中:
1、将 TuSDKVideoDemo libs 下的所有 jar 包(其中,bugly_crash_release_2.6.5.jar 是用来收集 bug 日志,可以不添加)复制到目标项目 libs 目录下,右键点击 jar 文件,并点击弹出菜单中的 “Add As Library”,将 jar 文件作为类库添加到项目中。
2、找到目标项目下 src/main/jniLibs 目录,如果没有 jniLibs 目录则新建一个,将 TuSDKVideoDemo libs 中的 so 文件 (arm64-v8a 等) 复制到你项目里的 jniLibs 目录下。
3、找到目标项目下 src/main/assets 目录,如果没有 assets 目录则新建一个,然后在 assets 目录下新建一个文件夹,名称为TuSDK.bundle。
4、将打包下载的资源复制到 TuSDK.bundle 目录下 (例如资源中的 others、stickers、textures 复制进 TuSDK.bundle 目录下)
5、如果打包后的滤镜在运行后的程序中查看时没有显示正常滤镜名称,则需要您在 TuSDK 项目中的 strings.xml 文件中手动添加其对应名称。 首先在 assets/TuSDK.bundle 文件夹下的 lsq_tusdk_configs.json 文件中找到没正常显示的滤镜,比如 lsq_filter_SkinNature,然后在 strings.xml 文件中写上
<string name="lsq_filter_SkinNature">自然</string>
如果需要配置多种语言,就在每个语言的 strings.xml 文件中分别写上对应名称即可。
1、在 Package Explorer 中的找到你的项目, 将 TuSDKVideoDemo 中 libs 下的 jar 包(其中,bugly_crash_release_2.6.5.jar 是用来收集 bug 日志,可以不添加)和 so 文件(arm64-v8a 等)复制到你的项目 libs 下。
2、找到你项目下的 assets 目录,如果没有 assets 目录则新建一个,然后在 assets 目录下新建一个文件夹,名称为 TuSDK.bundle。
3、将打包下载的资源复制到 TuSDK.bundle 目录下(例如资源中的 others、stickers、textures复制进TuSDK.bundle 目录下)
4、如果打包后的滤镜在运行后的程序中查看时没有显示正常滤镜名称,则需要您在 TuSDK 项目中的 strings.xml 文件中手动添加其对应名称。 首先在 assets/TuSDK.bundle 文件夹下的 lsq_tusdk_configs.json 文件中找到没正常显示的滤镜,比如 lsq_filter_SkinNature,然后在 strings.xml 文件中写上
<string name="lsq_filter_SkinNature">自然</string>
如果需要配置多种语言,就在每个语言的 strings.xml 文件中分别写上对应名称即可。
打开全局 Application 文件,全局 Application 类可以选择继承 TuSdkApplication 或不继承,然后在 onCreate 方法中使用 TuSdk.init() 方法来进行初始化,并将复制的密钥作为该方法的参数,如下:
@Override
public void onCreate()
{
// 设置资源类,当 Application id 与 Package Name 不相同时,必须手动调用该方法, 且在 init 之前执行。
// TuSdk.setResourcePackageClazz(R.class);
TuSdk.enableDebugLog(true);
// 初始化SDK (请将目标项目所对应的密钥放在这里)
TuSdk.init(this.getApplicationContext(), "12aa4847a3a9ce68-04-ewdjn1");
}
为方便开发时定位错误,可打开 TuSDK 的调试日志,即在初始化密钥之前添加以下代码(放在初始化密钥之后无效):
TuSdk.enableDebugLog(true);
在 AndroidManifest.xml 中,首先定义程序需要的权限:
<!-- 访问网络 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 获取WIFI信息 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 允许访问GPS -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 允许应用程序写数据到外部存储设备(主要是SD卡) -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 在sdcard中创建/删除文件的权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 请求访问使用照相设备 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 开启闪光灯权限 -->
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
然后定义应用的全局 Application 对象,设置 allowBackup、hardwareAccelerated 和 largeHeap 三个重要选项为 true。
<application
android:name="org.lasque.tusdk.TuApplication"
android:allowBackup="true"
android:hardwareAccelerated="true"
android:largeHeap="true"
</application>
TuSdkFilterEngine 是视频滤镜处理 API 的接口
/**
*
*
* @param isOESTexture 是否处理 OES Texture
* @param managedGLLifecycle 是否托管GL生命周期
*/
TuSdkFilterEngine filterEngine = new TuSdkFilterEngineImpl(false, true);
// 设置是否输出原始图片朝向 false: 图像被转正后输出
filterEngine.setOriginalCaptureOrientation(true);
// 设置输入的图片朝向 如果输入的图片不是原始朝向 该选项必须配置
filterEngine.setInputImageOrientation(ImageOrientation.Up);
filterEngine.setOutputImageOrientation(ImageOrientation.Up);
// 设置是否开启动态贴纸功能
filterEngine.setEnableLiveSticker(true);
代理方法
/**
* 特效事件委托
*/
private TuSDKVideoProcesser.TuSDKVideoProcessorMediaEffectDelegate mMediaEffectDelegate = new TuSDKVideoProcesser.TuSDKVideoProcessorMediaEffectDelegate() {
/**
* 当前被应用的特效
* @param mediaEffectData
*/
@Override
public void didApplyingMediaEffect(final TuSdkMediaEffectData mediaEffectData) {
ThreadHelper.post(new Runnable() {
@Override
public void run() {
switch (mediaEffectData.getMediaEffectType())
{
case TuSdkMediaEffectDataTypeFilter: {
// 切换滤镜时刷新滤镜参数视图
mFilterConfigView.setFilterArgs(mediaEffectData, mediaEffectData.getFilterArgs());
mFilterConfigView.setVisibility(View.VISIBLE);
}
break;
default:
break;
}
}
});
}
@Override
public void didRemoveMediaEffect(List<TuSdkMediaEffectData> list) {
}
};
// 清除所有的贴纸
mFilterEngine.removeAllLiveSticker();
//在 GLSurfaceView 的 回调 onSurfaceCreated 中调用该方法
mFilterEngine.onSurfaceCreated();
//在 GLSurfaceView 的 回调 onSurfaceCnaged 中调用该方法
mFilterEngine.onSurfaceChanged(width,height);
//在 GLSurfaceView 的 回调 onSurfaceDestroy 中调用该方法,销毁资源
mFilterEngine.onSurfaceDestroy();
/**
* 处理帧数据
*
* @param texId texture ID
* @param isCopyToSourceTexture 是否复制到原始纹理上
* @param width 图像宽度
* @param height 图像高度
* @param timeNs 输入时间戳(纳秒)
* @return 处理后的材质ID
*/
mFilterEngine.processFrame(texId,isCopyToSourceTexture,width,height,timeNs);
1.初始化滤镜栏
替换资源文件后,查看资源文件(TuSDK.bundle/others/lsq_config.json)中滤镜的 filerCode,替换到项目中对应的位置。
替换滤镜资源后,需要根据新的 filterCode 更改对应滤镜效果缩略图文件的名称。
// 滤镜 编号 列表, 每个 code 代表一种滤镜效果, 具体 code 可在 lsq_tusdk_configs.json 查看 (例如:lsq_filter_SkinNature02 滤镜的 code 为 SkinNature02)
private static final String[] VIDEOFILTERS = new String[]{"Olympus_1_1", "Leica_1_1", "Gold_1_1", "Cheerful_1_1", "White_1_1",
"s1950_1_1", "Blurred_1_1","Newborn_1_1","Fade_1_1","NewYork_1_1","nature","pink","jelly"};
2.添加滤镜效果
// 为了保证滤镜效果正常 在添加新滤镜之前,清除当前滤镜
// 动漫滤镜效果与普通滤镜效果不可叠加使用
mFilterEngine.removeMediaEffectsWithType(TuSdkMediaEffectDataTypeFilter);
mFilterEngine.removeMediaEffectsWithType(
TuSdkMediaEffectData.TuSdkMediaEffectDataType.TuSdkMediaEffectDataTypeComic);
//创建滤镜对象,初始化需传入滤镜编号
TuSdkMediaFilterEffectData effectData = new TuSdkMediaFilterEffectData(
filterCode);
mFilterEngine.addMediaEffectData(effectData);
滤镜相关控件,存放在TuSDKFilterEngineModule/tusdk/filter 目录下 滤镜列表实现为FilterRecyclerAdapter 详细使用参考Demo即可
1.贴纸相关控件初始化
贴纸功能相关类:
StickerFragment.java
StickerGroupCategories.java
StickerRecyclerAdapter.java
以及 TuSDKFilterEngineModule/tusdk/model中的类
加载在线滤镜需要在资源文件里配置在线资源列表(full_screen_sticker 和 square_sticker)放在raw文件夹下
资源id在控制台上线资源里获取
格式
{
"stickerGroups" : [
{
"name" : "荧光猫耳",
"id" : "1455",
"previewImage" : "/stickerGroup/img?id=1455"
},
{
"name" : "金刚",
"id" : "1456",
"previewImage" : "/stickerGroup/img?id=1456"
}
]
}
2.添加贴纸对象
// 添加新贴纸前,需要清除当前使用的贴纸
mFilterEngine.removeAllLiveSticker();
//获取贴纸对象,通过贴纸id获取
StickerGroup group = StickerLocalPackage.shared().getStickerGroup(groupId);
// 创建贴纸对象,初始化需传入StickerGroup对象
TuSdkMediaStickerEffectData stickerEffectData = new TuSdkMediaStickerEffectData(group);
mFilterEngine.addMediaEffectData(stickerEffectData);
/**
* 切换美颜预设按键
*
* @param useSkinNatural true 自然(精准)美颜 false 极致美颜
*/
private void switchConfigSkin(boolean useSkinNatural) {
TuSdkMediaSkinFaceEffect skinFaceEffect = new TuSdkMediaSkinFaceEffect(useSkinNatural);
// 美白
SelesParameters.FilterArg whiteningArgs = skinFaceEffect.getFilterArg("whitening");
whiteningArgs.setMaxValueFactor(useSkinNatural ? 0.4f : 0.5f);//设置最大值限制
// 磨皮
SelesParameters.FilterArg smoothingArgs = skinFaceEffect.getFilterArg("smoothing");
smoothingArgs.setMaxValueFactor(1.0f);//设置最大值限制
// 红润
SelesParameters.FilterArg ruddyArgs = skinFaceEffect.getFilterArg("ruddy");
ruddyArgs.setMaxValueFactor(useSkinNatural ? 0.35f : 0.65f);//设置最大值限制
if (mFilterEngine.mediaEffectsWithType(TuSdkMediaEffectDataTypeSkinFace).size() == 0) {
mFilterEngine.addMediaEffectData(skinFaceEffect);
whiteningArgs.setPrecentValue(0.5f);//设置默认显示
smoothingArgs.setPrecentValue(0.5f);//设置默认显示
} else {
TuSdkMediaSkinFaceEffect oldSkinFaceEffect = (TuSdkMediaSkinFaceEffect) mFilterEngine.mediaEffectsWithType(TuSdkMediaEffectDataTypeSkinFace).get(0);
mFilterEngine.addMediaEffectData(skinFaceEffect);
for (SelesParameters.FilterArg filterArg : oldSkinFaceEffect.getFilterArgs()) {
SelesParameters.FilterArg arg = skinFaceEffect.getFilterArg(filterArg.getKey());
arg.setPrecentValue(filterArg.getPrecentValue());
}
}
skinFaceEffect.submitParameters();
}
1.微整形参数列表
/** 微整形参数 */
private List<String> mBeautyPlastics = new ArrayList(){
{
add("eyeSize"); //大眼
add("chinSize"); // 瘦脸
add("noseSize"); //隆鼻
add("mouthWidth"); //嘴型
add("lips"); //嘴唇
add("archEyebrow"); //细眉
add("browPosition"); //眉高
add("jawSize"); //下巴
add("eyeAngle");//眼角
add("eyeDis"); //眼距
add("forehead");//发际线
}
};
//微整形各参数默认值
/** 微整形默认值 Float 为进度值 */
private HashMap<String, Float> mDefaultBeautyPercentParams = new HashMap<String, Float>() {
{
put("forehead",0.5f);
put("chinSize",0.5f);
put("browPosition",0.5f);
put("archEyebrow",0.5f);
put("eyeSize",0.5f);
put("eyeAngle",0.5f);
put("eyeDis",0.5f);
put("noseSize",0.5f);
put("mouthWidth",0.5f);
put("lips",0.5f);
put("jawSize",0.5f);
}
};
2.添加微整形效果
// 目前只有大眼,瘦脸,隆鼻 三个参数会设置最大值限制,其他参数需要根据用户需要自行设置
TuSdkMediaPlasticFaceEffect plasticFaceEffect = new TuSdkMediaPlasticFaceEffect();
mFilterEngine.addMediaEffectData(plasticFaceEffect);
for (SelesParameters.FilterArg arg : plasticFaceEffect.getFilterArgs()) {
if (arg.equalsKey("eyeSize")) {// 大眼
arg.setMaxValueFactor(0.85f);// 最大值限制
}
if (arg.equalsKey("chinSize")) {// 瘦脸
arg.setMaxValueFactor(0.9f);// 最大值限制
}
if (arg.equalsKey("noseSize")) {// 隆鼻
arg.setMaxValueFactor(0.6f);// 最大值限制
}
}
for (String key : mDefaultBeautyPercentParams.keySet()) {
TLog.e("key -- %s",mDefaultBeautyPercentParams.get(key));
submitPlasticFaceParamter(key,mDefaultBeautyPercentParams.get(key));
微整形功能的详细设置及参数调整,请参考Demo中TuSDKEditorBarFragment->switchBeautyPlasticConfig()
方法
TuSdkAudioPitchEngine 为音频处理引擎
public static enum TuSdkSoundPitchType {
Normal,
Monster
Uncle
Girl,
Lolita;
}
//初始化输入音频格式
TuSdkAudioInfo inputAudioInfo = new TuSdkAudioInfo(AudioFormat);
// 初始化TuSdkAudioPitchEngine
TuSdkAudioPitchEngine mTuSdkAudioPitchEngine = new TuSdkAudioPitchEngine(inputAudioInfo);
//TuSdkAudioPitchEngine 为异步回调 设置回调代理
mTuSdkAudioPitchEngine.setOutputBufferDelegate(
TuSdkAudioEngine.TuSdKAudioEngineOutputBufferDelegate);
//设置变声类型
mTuSdkAudioPitchEngine.setSoundPitchType(
TuSdkAudioPitchEngine.TuSdkSoundPitchType.Girl);
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
//设置当前Buffer大小
bufferInfo.size = i;
//设置当前Buffer对应时间戳
bufferInfo.presentationTimeUs = l / 1000L;
//音频处理
mTuSdkAudioPitchEngine.processInputBuffer(byteBuffer, bufferInfo);
3.0.0
以下用户在升级 SDK 时参考