涂图

  • 首页
  • 解决方案
    • 拍照和图片编辑
    • 视频录制和后期编辑
    • 模板视频
    • 人像美颜
    • 人脸特效
    • 滤镜特效
    • 贴纸特效
  • API服务
    • 人像服务
    • 视频融合
    • 人脸云
    • 在线滤镜
  • 客户案例
  • 下载
  • 文档
  • 关于我们
  • 控制台
  • 一、新手上路
  • 控制台入门
    • 控制台使用说明
  • 二、SDK 文档
  • 图像 SDK
    • 产品说明
      • 使用指南
      • 性能测试报告
    • iOS 文档
      • 快速开始
      • 安装与更新
      • 集成向导
      • 相机组件的使用
      • 相册组件的使用
      • 照片美化组件的使用
      • 主题包基础使用
      • 自定义滤镜
      • 自定义贴纸
      • 自定义界面
      • 自定义 ProgressHUD 提示框
      • API 文档
      • 致谢
    • Android 文档
      • 快速开始
      • 安装与更新
      • 集成向导
      • 相机组件的使用
      • 照片美化组件的使用
      • 头像设置组件的使用
      • 多选相册组件的使用
      • 主题包基础使用
      • 自定义贴纸
      • 自定义滤镜
      • 自定义界面
      • 自定义进度信息提示框
      • 自定义 Activity 打开相机
      • API 文档
      • 致谢
    • iOS 技术问题
      • 「Incorrenct app key」
      • 更换滤镜效果图
      • 导航栏与状态栏
      • 组件中使用部分滤镜
      • Cocoapods 相关问题
      • 图片尺寸变化
      • Photos.framework 相关错误
      • 多包名发布
      • GPUImage 的相关错误
      • TuSDKTSALAsset 转换系统对象
      • 滤镜无法显示名称
      • 获取相机的点击事件
    • Android 技术问题
      • Incorrenct app key
      • 重复引用包
      • Recyclerview 库缺失
      • 方法数超出 65536 限制
      • 传入图片路径
      • 指定裁剪比例
      • 指定相册每行列数
      • 禁用相册自动跳转
      • 如何使用部分滤镜?
      • 代码混淆
      • TuSDK 使用的依赖库
      • 多渠道打包
      • 设置相机输出尺寸
      • 相机横屏设置
      • 自定义照片美化组件各功能模块效果默认参数值
    • 版本更新日志
      • iOS 版本更新日志
      • Android 更新日志
  • 短视频 SDK
    • 产品说明
      • 使用指南
      • 性能测试报告
    • iOS 文档
      • 快速开始
      • 集成向导
      • 录制相机的使用
      • 视频编辑器的使用
      • 功能 API 的使用
      • API 文档
    • Android 文档
      • 快速开始
      • 集成向导
      • 录制相机的使用
      • 视频编辑器的使用
      • 功能 API 的使用
      • API 文档
    • iOS 技术问题
      • 常见问题
    • Android 技术问题
      • 常见问题
    • 版本更新日志
      • iOS 版本更新日志
      • Android 版本更新日志
  • 视频融合 SDK
    • 产品说明
      • 使用指南
      • 模板设计规范
      • 支持的 AE 功能
      • 模板管理
    • iOS 文档
      • 快速开始
      • 安装与更新
      • 集成向导
      • 模版加载器的使用
      • 模板播放器的使用
      • 模板导出器的使用
      • API文档
    • Android 文档
      • 快速开始
      • 安装与更新
      • EVA播放器的使用
      • 模板资源管理器的使用
      • 模板保存器的使用
      • API 文档
    • 模板导出
      • 模板导出插件安装
      • 导出插件使用
      • 模板打包规范
    • 版本更新日志
      • iOS 版本更新日志
      • Android 版本更新日志
      • 导出插件版本更新日志
  • 直播特效 SDK
    • 产品说明
      • 产品介绍
    • iOS 文档
      • TuSDK直播特效接入说明-iOS
    • Android 文档
      • TuSDK直播特效接入说明-Android
  • 三、云服务文档
  • 人像服务
    • 使用文档
      • 快速入门
      • 核心功能
    • API概述
      • API 概述
      • API 文档
    • 常见问题
      • 常见问题
  • 视频融合(云渲染)
    • 使用文档
      • 快速入门
      • 模板设计规范
      • 支持的 AE 功能
      • 模板管理
    • API概述
      • API概述
      • API 文档
    • 模板导出
      • 模板导出插件安装
      • 导出插件使用
      • 模板打包规范
    • 常见问题
    • 版本更新日志
      • 导出插件版本更新日志
  • 人脸云
    • 使用文档
      • 快速入门
      • 核心功能
    • API 概述
      • API 概述
    • 常见问题
      • 常见问题
  • 在线滤镜
    • 使用文档
      • 快速入门
      • 核心功能
      • FILTER API
      • API 错误码表
    • API概述
      • API 概述
    • 常见问题
      • 常见问题
  • 人脸核查服务
    • 使用说明
      • 产品介绍
      • 服务开通
      • 用户数据管理
    • 费用说明
      • 费用说明
    • 客户端说明
      • 操作须知
      • 客户端配置
      • 基本功能操作
      • 统计数据操作
    • 常见问题
      • 常见问题
  • 四、综合
  • 云服务账单说明
  • 应用包名与密钥
  • 遇到问题,怎么办?
  • 如何使用贴纸管理、滤镜管理?
  • 基础服务开发者升级流程
  • 五、常见问题
  • 常见问题

TuSDK 直播特效 API

文件构成

包名

  • 在 Eclipse 中,Android 应用的包名是 Package Name,它定义在 AndroidManifest.xml 文件 中的 package。例如 org.lasque.tusdkdemo
  • 在 Android Studio 中,如果有在 build.gradle 文件中定义 applicationId 属性,那么包名即是指此处 applicationId 的值;如果没有在 build.gradle 文件中定义 applicationId,那么包名还是指 AndroidManifest.xml 文件中的 package 属性的值

应用密钥(AppKey)

  • 应用密钥是您的应用在 TuSDK 的唯一标识符。您可以登录后在「我的应用」页面查看到每个应用的密钥。 如果您修改了应用的包名,密钥将随之改变,您需要在代码内更新它。

权限密钥(master key)

  • 权限密钥位于资源配置包中的 config.json 文件中,您可以通过下载资源包获取。 如果您修改了应用的包名,密钥将随之改变,您需要在代码内更新它。

安装与更新

Android Studio

首次安装

您可以依据以下步骤将 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 文件中分别写上对应名称即可。

更新

  • 删除旧文件,然后重复首次安装的步骤。

ADT (Eclipse)

首次安装

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 文件中分别写上对应名称即可。

更新

  • 删除旧文件,然后重复首次安装的步骤。

TuSDK 的项目配置

初始化密钥

打开全局 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

在 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 的使用

TuSdkFilterEngine 是视频滤镜处理 API 的接口

初始化

  1. 初始化
         /**
         * 
         *
         * @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 为音频处理引擎

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);

变更日志

  • 以下内容供当前使用 SDK版本为 3.0.0 以下用户在升级 SDK 时参考
  • TuSDKFilterEngine 已被废弃由 TuSdkFilterEngine 替代
  • 滤镜与美颜功能进行了分离
  • 增加了微整形功能说明
  • 贴纸相关功能进行了 API 修改

  • 文件构成
  • 安装与更新
  • TuSDK 的项目配置
  • TuSdkFilterEngine 的使用
  • 变声变调功能
  • 在线技术支持
  • 专业售前售后团队
  • 版本定期更新
  • 全方位解决方案

商务合作

  • 177-6716-7529
  • 2969573855
  • sales@tusdk.com
  • 浙江省 杭州市 西湖区 西斗门9号 福地创业园1号楼3楼301室

关注我们

qrcode

©2019-2020 TUTUCLOUD. All Rights Reserved. 杭州微禾迅科技有限公司 | 浙ICP备14040447号-1 | 浙公网安备33010602001649号

  • 177-6716-7529
  • sales@tusdk.com
  • 2969573855