涂图

  • 首页
  • 解决方案
    • 拍照和图片编辑
    • 视频录制和后期编辑
    • 模板视频
    • 人像美颜
    • 人脸特效
    • 滤镜特效
    • 贴纸特效
  • API服务
    • 人像服务
    • 视频融合
    • 人脸云
    • 在线滤镜
  • 客户案例
  • 下载
  • 文档
  • 关于我们
  • 控制台
  • 一、新手上路
  • 控制台操作说明
    • 控制台使用说明
    • 自定义资源上传说明
  • 二、SDK 文档
  • 图像 SDK
    • 产品说明
      • 产品指南
      • 性能测试报告
    • iOS 文档
      • 快速开始
      • 安装与更新
      • 集成向导
      • 相机组件的使用
      • 相册组件的使用
      • 照片美化组件的使用
      • 主题包基础使用
      • 自定义滤镜
      • 自定义贴纸
      • 自定义界面
      • 自定义 ProgressHUD 提示框(2.0.0~3.2.7)
      • 自定义 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文档
      • TuSDK Video Editor iOS 接入文档
    • Android文档
      • TuSDK Video Editor Android 接入文档
    • 版本更新日志
      • iOS 版本更新日志
      • Android 版本更新日志
  • 流处理(特效相机) SDK
    • 产品说明
      • 产品指南
    • iOS 文档
      • TuSDK特效相机接入文档-iOS
      • TuSDK直播特效接入说明-iOS
    • Android 文档
      • TuSDK特效相机接入文档-Android
      • TuSDK直播特效接入说明-Android
    • 版本更新日志
      • iOS 版本更新日志
      • Android 版本更新日志
  • 视频融合 SDK
    • 产品说明
      • 产品指南
      • 模板管理
    • iOS 文档
      • 快速开始
      • 安装与更新
      • TuSDK EVA 接入说明 2.0
      • API文档
    • Android 文档
      • 快速开始
      • 安装与更新
      • TuSDK EVA 接入说明 (2.0.0+)
      • API 文档
    • 模板设计
      • (新)标准模板设计规范
      • (旧)标准模板设计规范
      • 支持的 AE 功能和属性
      • 动态模板设计规范
    • 模板导出
      • (新)模板导出插件安装
      • (新)模板导出插件使用
      • (旧)模板导出插件安装
      • (旧)模板导出插件使用
      • (旧)模板效果查看器
      • (旧)模板打包规范
    • 版本更新日志
      • iOS 版本更新日志
      • Android 版本更新日志
      • 导出插件版本更新日志
      • 效果查看器更新日志
  • 短视频 SDK
    • 产品说明
      • 产品指南
      • 性能测试报告
    • iOS 文档
      • 快速开始
      • 集成向导
      • 录制相机的使用
      • 视频编辑器的使用
      • 功能 API 的使用
      • API 文档
    • Android 文档
      • 快速开始
      • 集成向导
      • 录制相机的使用
      • 视频编辑器的使用
      • 功能 API 的使用
      • API 文档
    • iOS 技术问题
      • 常见问题
    • Android 技术问题
      • 常见问题
    • 版本更新日志
      • iOS 版本更新日志
      • Android 版本更新日志
  • 三、云服务文档
  • 人像服务
    • 使用文档
      • 快速入门
      • 核心功能
    • API概述
      • API 概述
      • API 文档
    • 常见问题
      • 常见问题
  • 视频融合(云渲染)
    • 使用文档
      • 快速入门
      • 模板管理
    • API概述
      • API概述
      • API 文档
    • 模板设计
      • (新)标准模板设计规范
      • (旧)标准模板设计规范
      • 支持的 AE 功能和属性
      • 动态模板设计规范
    • 模板导出
      • (新)模板导出插件安装
      • (新)模板导出插件使用
      • (旧)模板导出插件安装
      • (旧)模板导出插件使用
      • (旧)模板效果查看器
      • (旧)模板打包规范
    • 常见问题
    • 版本更新日志
      • 导出插件版本更新日志
      • 效果查看器更新日志
  • 人脸云
    • 使用文档
      • 快速入门
      • 核心功能
    • API 概述
      • API 概述
    • 常见问题
      • 常见问题
  • 在线滤镜
    • 使用文档
      • 快速入门
      • 核心功能
      • FILTER API
      • API 错误码表
    • API概述
      • API 概述
    • 常见问题
      • 常见问题
  • 四、综合
  • 涂图隐私协议
  • 用户退出机制
  • 动态贴纸设计规范
  • 美妆贴纸设计规范
  • 云服务账单说明
  • 应用包名与密钥
  • 基础服务开发者升级流程
  • 五、常见问题
  • 常见问题
  • 遇到问题,怎么办?
  • 如何使用贴纸管理、滤镜管理?

录制相机的使用

类名 功能说明
TuSdkRecorderVideoCamera 视频录制拍照

1. 录制相机的使用

1.1 请求权限

除了按照集成向导步骤在AndroidManifest.xml加上权限外,在Android 6.0后都需申请动态权限,以下是打开相机所需申请的权限:

  String[] permissions = new String[]{
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.CAMERA,
        Manifest.permission.RECORD_AUDIO
  };

1.2 构建对象

创建并配置 TuSdkRecorderVideoCamera 对象,代码如下:

  RelativeLayout cameraView = (RelativeLayout) findViewById(R.id.lsq_cameraView);

  // 录制相机配置,目前只支持硬编
  TuSdkRecorderCameraSetting captureSetting = new TuSdkRecorderCameraSetting();

  TuSdkRecorderVideoCamera videoCamera = new TuSdkRecorderVideoCameraImpl(getBaseContext(),cameraView,captureSetting);

构造方法中需要传入下面三个参数:

(1)当前上下文(Context)

(2)相机采集配置(TuSdkRecorderCameraSetting)

(3)相机视图容器(RelativeLayout)

1.3 相机采集配置

TuSDKVideoCaptureSetting 中可以对相机采集时的多项属性进行设置,包括:

  • facing,相机朝向(默认: CameraFacing.Front 前置)

  • 相机视图容器是一个 RelativeLayout 布局,一般在 XML 布局文件中指定,传入 TuSDKRecordVideoCamera 构造方法中后,会将相机预览视图加载在该视图容器中。

1.4 相机设置

获取录制相机对象后,可以对该相机的属性进行一些设置。

  • 开启或关闭动态贴纸
// 是否开启动态贴纸(默认: false)
public void setEnableLiveSticker(boolean enableLiveStickr)
  • 开启或关闭自动持续对焦
// 禁用自动持续对焦 (默认: false)
public void setDisableContinueFocus(boolean disableContinueFoucs)
  • 设置水印(图片最大边长不宜超过 500)
// 设置水印,默认为空
public void setWaterMarkImage(Bitmap mWaterMarkImage)
// 设置水印位置
public void setWaterMarkPosition(WaterMarkPosition mWaterMarkPosition)
  • 设置视频录制结果委托
public void setRecorderVideoCameraCallback(TuSdkRecorderVideoCameraCallback recorderCallback)

指定录制相机的事件委托,该委托中有下面四个接口用来通知相机状态改变:

  • 设置最小、最大录制时长(单位:/s)
// 设置最小录制时长
public void setMinRecordingTime(int minRecordingTime) 
// 设置最大录制时长
public void setMaxRecordingTime(int maxRecordingTime)
  • 设置相机事件委托

使用 setDelegate(TuSDKVideoCameraDelegate) 设置相机事件委托,详细可以参看 demo 中的使用示例

  • 设置相机拍照监听
public void setCameraListener(TuSdkCameraListener cameraListener)
  • 设置特效改变监听
public void setMediaEffectChangeListener(TuSdkMediaEffectChangeListener mediaEffectChangeListener)
  • 设置人脸检测结果回调

    public void setFaceDetectionCallback(TuSdkFaceDetectionCallback faceDetectionCallback)
  • 设置视频编码配置

public final void setVideoEncoderSetting(TuSdkRecorderVideoEncoderSetting videoEncoderSetting) 

可以设置视频编码时的参数,包括:

videoSize,输出视频尺寸(默认:TuSdkSize(320, 480))

videoQuality,视频质量

mediacodecAVCIFrameInterval,I 帧时间间隔 (默认:1)

enableAllKeyFrame 是否最大限度输出 I 帧,默认false

推荐使用 SDK 默认的编码配置,如下:

// 推荐编码配置
TuSdkRecorderVideoEncoderSetting encoderSetting = TuSdkRecorderVideoEncoderSetting.getDefaultRecordSetting();
mVideoCamera.setVideoEncoderSetting(encoderSetting);
  • 保存系统相册
// 保存系统相册 (默认保存, 当设置为 false 时, 保存为临时文件)
public void setSaveToAlbum(boolean mSaveToAlbum)
// 保存到系统相册的相册名称
public void setSaveToAlbumName(String mSaveToAlbumName)

当设置 false 可 TuSdkRecorderVideoCameraCallback 回调中获取result.

  • 添加开启人脸检测
public void setEnableFaceDetection(boolean enableFaceDetection) 
  • 是否启用音频录制

    public void setEnableAudioCapture(boolean mEnableAudioCapture)
  • 调节采集比例


/** 使用动画改编视频预览显示比例 (默认:0, 0 <= RegionRatio, 当设置为0时全屏显示) */
    @Override
    public void changeRegionRatio(float mRegionRatio)


/** 视频预览显示比例 (默认:0, 0 <= RegionRatio, 当设置为0时全屏显示) */
    @Override
    public void setRegionRatio(float regionRatio)


/** 是否能调节比例,true 是 false 否 */
    @Override
    public boolean canChangeRatio()
  • 曝光补偿设置
 /**
     * 设置曝光补偿
     * @param ev 曝光补偿级数
     */
    @Override
    public void setExposureCompensation(int ev)

 /**
     * @return 获取最小曝光补偿级数
     */
    @Override
    public int getMinExposureCompensation()

/**
     * @return 获取当前曝光补偿级数
     */
    @Override
    public int getCurrentExposureCompensation()

/**
     * @return 获取曝光补偿基数
     */
    @Override
    public float getExposureCompensationStep()

1.5 相机操作接口

SDK 提供了多个操作相机的方法,供用户操作相机开启、关闭、恢复、暂停,如下:

  • 启动相机采集

    startCameraCapture()
  • 停止相机采集

    stopCameraCapture()
  • 恢复相机采集

    resumeCameraCapture()
  • 暂停相机采集

    pauseCameraCapture()

同时,这些方法需要配合所在 Activity 的生命周期中使用,如下:

  @Override
  protected void onResume()
  {
    super.onResume();
    resumeCameraCapture();
  }

  @Override
  protected void onPause()
  {
    super.onPause();
    pauseCameraCapture();
  }

  @Override
  protected void onDestroy()
  {
    super.onDestroy();
    stopCameraCapture();

    if (mVideoCamera != null) {
        mVideoCamera.destroy();
    }
  }

1.6 录制接口

录制相机对象可以通过下面四个接口控制开启、暂停和停止录制动作,以及判断是否正在录制中:

  • 开始录制

    startRecording()
  • 暂停录制

    pauseRecording()
  • 结束录制

    stopRecording()
  • 判断是否正在录制中

    isRecording()
  • 录制结果

配合setSaveToAlbum,设置true将视频保存到相册,设置false通过TuSDKVideoResult获取对应视频的临时文件,可进行自定义操作。

// 设置录制委托
public void setVideoDelegate(TuSDKRecordVideoCameraDelegate mDelegate)
/** 录制相机事件委托 */
public static interface TuSdkRecorderVideoCameraCallback
{
    /**
     * 视频录制结果
     * 
     * @param result
     *            视频结果
     */
    void onMovieRecordComplete(TuSDKVideoResult result);

    /**
     * 录制进度改变 (运行在主线程)
     * 
     * @param progress 当前录制进度( 0 - 1 ) 相对于mMaxRecordingTime
     * @param durationTime 当前录制持续时间 单位:/s
     */
    void onMovieRecordProgressChanged(float progress, float durationTime);

    /**
     * 录制状态改变
     * @param state
     */
    void onMovieRecordStateChanged(RecordState state);

    /**
     * 录制出错
     * 
     */
    void onMovieRecordFailed(RecordError error);

}

1.7 相机状态

  • 相机状态

       /** 相机运行状态 */
       public enum CameraState
       {
          /** 未知状态 */
          StateUnknow,
          /** 正在启动 */
          StateStarting,
          /** 已经启动 */
          StateStarted,
          /** 正在拍摄 */
          StateCapturing,
          /** 拍摄完成 */
          StateCaptured
       }
  • 录制状态

    /** 录制状态 */
    public enum RecordState
    {
       /** 录制中 */
       Recording,
    
       /** 正在保存视频 */
       Saving,
    
       /** 暂停录制 */
       Paused,
    
       /** 录制完成 */
       RecordCompleted,
    
       /** 已取消 */
       Canceled,
    }
  • 错误状态

    /** 录制时错误 */
    public enum RecordError
    {
       /** 未知错误 */
       Unknow,
    
       /** 可用空间不足 */
       NotEnoughSpace,
    
       /** 无效的录制时间(录制时间较短无法生成视频) */
       InvalidRecordingTime,
    
       /** 低于最小录制时间 */
       LessMinRecordingTime,
    
       /** 超过最大录制时间 */
       MoreMaxDuration,
    
       /** 保存失败 */
       SaveFailed,
    
    }

1.8 相机监听接口

  • 拍摄图片

    captureImage()
  • 可通过TuSdkCameraListener 获取拍照结果

    /** Video Camera Delegate */
    public static interface TuSdkCameraListener {
    
      /**
       * 滤镜更改事件,每次调用 switchFilter 切换滤镜后即触发该事件,运行在主线程
       *
       * @param filter 新的滤镜对象
       * @since V3.2.0
       */
      void onFilterChanged(FilterWrap filter);
      /**
       * 相机状态改变 (如需操作UI线程, 请检查当前线程是否为主线程)
       *
       * @param camera
       *            相机对象
       * @param newState
       *            相机运行状态
       */
      void onVideoCameraStateChanged(TuSdkStillCameraAdapter.CameraState newState);
    
      /**
       * 获取截屏图片
       *
       * @param camera
       *            相机对象
       * @param bitmap
       *            图片
       */
      void onVideoCameraScreenShot(Bitmap bitmap);
    }

1.9 RegionHandler 使用说明

使用自定义 RegionHandler 可以实现把相机预览视图(非全屏时)上下左右移动指定距离的功能。 可以新建子类继承 RegionDefaultHandler,然后子类中重写下面三个方法:

void setWrapSize(TuSdkSize size)
RectF recalculate(float ratio, TuSdkSize size)
RectF changeWithRatio(float ratio, RegionChangerListener listener)

然后使用 mVideoCamera.setRegionHandler(RegionHandler) 方法将自己的子类设置进去,最后使用 mVideoCamera.changeRegionRatio(float) 方法刷新视图,使 regionHandler 生效。 以 1:1 视图为例:

 // 刷新视图,使 regionHandler 生效, 1:1 视图
  mVideoCamera.changeRegionRatio(1.0f);

在 Demo 中是以 1:1 视图显示的,如果要修改成全屏显示,需要修改两个地方:

  • 删除自定义的 RegionHandler

  • 将 mVideoCamera.changeRegionRatio(1.0f) 中的参数修改为 0

1.10 特效改变监听

  • 特效数据改变监听

可以根据返回TuSdkMediaEffectData数据类型分类处理。

  /**
    * 特效数据改变
    *
    * @since V3.2.0
    **/
  public static interface TuSdkMediaEffectChangeListener {
    /**
     * 一个新的特效将要被应用
     *
     * @param mediaEffectData 将要应用的特效数据
     * @since V3.2.0
     */
    void didApplyingMediaEffect(TuSdkMediaEffectData mediaEffectData);

    /**
     * 特效将要被移除的特效
     *
     * @param mediaEffects
     * @since V3.2.0
     */
    void didRemoveMediaEffect(List<TuSdkMediaEffectData> mediaEffects);
  }

1.11 人脸检测委托

可以返回人脸检测到的FaceDetectionResultType和人脸个数。

/**
 * 人脸检测结果委托
 *
 * @since V3.2.0
 */
public enum FaceDetectionResultType {
    /**
     * Succeed
     */
    FaceDetected,
    /**
     * No face is detected
     */
    NoFaceDetected,
}
/**
  * 人脸检测委托
  *
  * @since V3.2.0
  */
public interface TuSdkFaceDetectionCallback {
    /**
     * 人脸检测结果
     *
     * @param resultType 人脸检测结果类型
     * @param faceCount  检测到的人脸数量
     * @since V3.2.0
     */
    void onFaceDetectionResult(FaceDetectionResultType resultType, int faceCount);
}

2. 滤镜使用 (普通滤镜和漫画滤镜)

2.1 获取滤镜 filterCode

可以在打包下载的资源文件中找到 lsq_tusdk_configs.json 文件,之前在控制台所打包的滤镜资源会在这个文件中显示,比如"name":"lsq_filter_VideoFair",则该滤镜的 filterCode 即为 VideoFair,需注意大小写。 可以将需要用到的 filterCode 放到一个滤镜数组中,切换滤镜时从该数组中取出 filterCode 即可,如下:

// 要支持多款滤镜,直接添加到数组即可
 private String[] videoFilters = new String[]{"VideoFair"};

2.2 加载并显示滤镜资源

Demo中滤镜列表使用FilterRecyclerAdapter和RecyclerView实现

this.mFilterAdapter.setFilterList(Arrays.asList(Constants.VIDEOFILTERS));

详细实现可以参考短视频 Demo 中的示例。
同时用户也可以使用自己的列表来显示滤镜,并可以自定义滤镜的缩略图(替换掉对应名称的图片即可)。

2.3 切换滤镜效果

  • 通过滤镜 Code 使用普通滤镜

    mCamera.addMediaEffectData(new TuSdkMediaFilterEffectData(code));
  • 通过滤镜 Code 使用动漫滤镜

    mCamera.addMediaEffectData(new TuSdkMediaComicEffectData(code));

2.2 滤镜参数调节

通过 TuSdkMediaEffectChangeListener 返回的TuSdkMediaEffectData进行滤镜参数调节,滤镜调节包含效果mixied等,我们提供了专门的参数调节View可进行快捷设置。

    mFilterConfigView.setFilterArgs(mediaEffectData,filterArg);
// 获取滤镜返回的调节参数
List<SelesParameters.FilterArg> filterArgs = mediaEffectData.getFilterArgs()
// 设置最大值限制范围 默认1.0,smoothing、mixied建议0.7,whitening建议 0.6
filterArg.setMaxValueFactor(factor);
// 设置对应的百分比值
filterArg.setPrecentValue(precentValue);
// 提交修改后的参数
mediaEffectData.submitFilterParameter();

3. 美颜,微整形的使用

3.1 微整形

设置微整形特效

// 添加一个默认微整形特效
TuSdkMediaPlasticFaceEffect plasticFaceEffect = new TuSdkMediaPlasticFaceEffect();
mCamera.addMediaEffectData(plasticFaceEffect);
// 以下为改变默认值进行提交参数
for (SelesParameters.FilterArg arg : plasticFaceEffect.getFilterArgs()) {
    if (arg.equalsKey("eyeSize")) {// 大眼
        arg.setMaxValueFactor(0.85f);// 最大值限制
    }
    if (arg.equalsKey("chinSize")) {// 瘦脸
        arg.setMaxValueFactor(0.8f);// 最大值限制
    }
    if (arg.equalsKey("noseSize")) {// 瘦鼻
        arg.setMaxValueFactor(0.6f);// 最大值限制
    }

}
for (String key : mDefaultBeautyPercentParams.keySet()) {
    submitPlasticFaceParamter(key,mDefaultBeautyPercentParams.get(key));
}

详细实现可以参考短视频 Demo 中的示例。

3.2 美肤

设置美肤特效 true 自然(精准)美颜 false 极致美颜

TuSdkMediaSkinFaceEffect skinFaceEffect = new TuSdkMediaSkinFaceEffect(true);

// 美白
SelesParameters.FilterArg whiteningArgs = skinFaceEffect.getFilterArg("whitening");
whiteningArgs.setMaxValueFactor(0.6f);//设置最大值限制
// 磨皮
SelesParameters.FilterArg smoothingArgs = skinFaceEffect.getFilterArg("smoothing");
smoothingArgs.setMaxValueFactor(0.7f);//设置最大值限制

whiteningArgs.setPrecentValue(0.3f);//设置默认显示

smoothingArgs.setPrecentValue(0.6f);//设置默认显示
mCamera.addMediaEffectData(skinFaceEffect);

详细实现可以参考短视频 Demo 中的示例。

4. 道具模块(动态贴纸和哈哈镜)

Demo中贴纸使用ViewPager和Fragment进行分类页面展示。 同时用户也可以使用自己的列表来显示贴纸,详细实现可以参考短视频 Demo。

/**
 * 设置道具适配器
 */
public void init(final FragmentManager fm){

    // 添加贴纸道具分类数据
    mPropsItemCategories.addAll(PropsItemStickerCategory.allCategories());

    // 添加哈哈镜道具分类
    mPropsItemCategories.addAll(PropsItemMonsterCategory.allCategories());

    mPropsItemPagerAdapter = new PropsItemPagerAdapter(fm, new PropsItemPagerAdapter.DataSource() {
        @Override
        public Fragment frament(int pageIndex) {

            PropsItemCategory category = mPropsItemCategories.get(pageIndex);

            switch (category.getMediaEffectType()) {
                case TuSdKMediaEffectDataTypeSticker: {
                    StickerPropsItemPageFragment fragment = new StickerPropsItemPageFragment(pageIndex, mPropsItemCategories.get(pageIndex).getItems());
                    fragment.setItemDelegate(mStickerPropsItemDelegate);
                    return fragment;
                }
                default: {
                    PropsItemMonsterPageFragment fragment = new PropsItemMonsterPageFragment(pageIndex, mPropsItemCategories.get(pageIndex).getItems());
                    fragment.setItemDelegate(mPropsItemDelegate);
                    return fragment;
                }
            }

        }

        @Override
        public int pageCount() {
            return mPropsItemCategories.size();
        }
    });

    mPropsItemViewPager.setAdapter(mPropsItemPagerAdapter);

    mPropsItemTabPagerIndicator.setViewPager(mPropsItemViewPager,0);
    mPropsItemTabPagerIndicator.setDefaultVisibleCounts(mPropsItemCategories.size());



    List<String> itemTitles  = new ArrayList<>();
    for (PropsItemCategory category : mPropsItemCategories)
        itemTitles.add(category.getName());


    mPropsItemTabPagerIndicator.setTabItems(itemTitles);
}

4.1 动态贴纸

贴纸道具主要实现部分StickerPropsItemPageFragment,请参考Demo实现。

  • 贴纸应用和取消
// 应用贴纸
TuSdkMediaStickerEffectData mediaStickerEffectData = new TuSdkMediaStickerEffectData(itemData);
mVideoCamera.addMediaEffectData(mediaStickerEffectData);
// 移除贴纸
mVideoCamera.removeMediaEffectsWithType(TuSdkMediaEffectData.TuSdkMediaEffectDataType.TuSdKMediaEffectDataTypeSticker);
  • 贴纸下载

请参考Demo中StickerRecyclerAdapter类
通过TuSDKOnlineStickerDownloader下载器进行贴纸下载控制

// 初始下载器
mStickerDownloader = new TuSDKOnlineStickerDownloader();
// 设置下载回到
mStickerDownloader.setDelegate(this);
// 下载贴纸
public final void downloadStickerGroup(StickerGroup stickerGroup)
/**
 * 下载事件委托
 *
 * @author gh.li
 *
 */
public static interface TuSDKOnlineStickerDownloaderDelegate
{
    /**
     * 下载进度改变
     *
     * @param stickerGroupId
     *            贴纸分组
     * @param progress
     *            当前进度
     * @param status
     *            状态
     */
    public void onDownloadProgressChanged(long stickerGroupId, float progress, DownloadTaskStatus status);
}
  • 动态贴纸配置分类

在资源文件夹raw下配置 customstickercategories.json,格式如下

{
    "categories": [
    {
        "categoryName": "搞怪cos",
        "stickers": [
        {
            "name": "晕",
            "id": "1622",
            "previewImage": "/stickerGroup/img?id=1622"
        },
        {
            "name": "京剧花旦",
            "id": "1591",
            "previewImage": "/stickerGroup/img?id=1591"
        }
    }]
}

动态贴纸资源需是控制台在线资源与打包资源里的动态贴纸,贴纸详情可在点击贴纸图片或者点击查看按钮查询
categoryName 组名 name 可使用官网预设名称,也可自定义
id 使用官网贴纸资源id
previewImage id=官网贴纸资源id

  • 获取动态贴纸配置分类文件

贴纸根据集成文档进行上线、打包等操作。

打包过的动态贴纸资源可在贴纸列表里直接使用,在线贴纸如果没有下载过则在列表里显示下载图标,下载至本地后才能使用。

    /**
     * 获取所有贴纸分类
     *
     * @return List<PropsItemStickerCategory>
     */
    public static List<PropsItemStickerCategory> allCategories() {

        List<PropsItemStickerCategory> categories = new ArrayList<>();

        try {
            InputStream stream = TuSdkContext.context().getResources().openRawResource(R.raw.customstickercategories);

            if (stream == null) return null;

            byte buffer[] = new byte[stream.available()];
            stream.read(buffer);
            String json = new String(buffer, "UTF-8");

            JSONObject jsonObject = JsonHelper.json(json);
            JSONArray jsonArray = jsonObject.getJSONArray("categories");
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject item = jsonArray.getJSONObject(i);

                // 该分类下的所有贴纸道具
                List<PropsItemSticker> propsItems = new ArrayList<PropsItemSticker>();

                JSONArray jsonArrayGroup = item.getJSONArray("stickers");

                for (int j = 0; j < jsonArrayGroup.length(); j++) {

                    JSONObject itemGroup = jsonArrayGroup.getJSONObject(j);
                    StickerGroup group = new StickerGroup();
                    group.groupId = itemGroup.optLong("id");
                    group.previewName = itemGroup.optString("previewImage");
                    group.name = itemGroup.optString("name");

                    PropsItemSticker propsItem = new PropsItemSticker(group);
                    propsItems.add(propsItem);
                }

                // 该贴纸道具分类
                PropsItemStickerCategory category = new PropsItemStickerCategory(propsItems);
                category.setName(item.getString("categoryName"));

                categories.add(category);

            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return categories;

    }

详细实现可以参考短视频 Demo 中的示例。

4.2 哈哈镜

哈哈镜道具主要实现部分PropsItemMonsterPageFragment,请参考Demo实现。

  • 哈哈镜应用和取消
// 应用哈哈镜
TuSDKMediaMonsterFaceEffect monsterFaceEffect = new TuSDKMediaMonsterFaceEffect(monsterFaceType);
mVideoCamera.addMediaEffectData(monsterFaceEffect);
// 移除哈哈镜
mVideoCamera.removeMediaEffectsWithType(TuSdkMediaEffectData.TuSdkMediaEffectDataType.TuSdkMediaEffectDataTypeMonsterFace);
  • 哈哈镜分类
    /**
     * 获取所有哈哈镜分类
     *
     * @return List<PropsItemMonsterCategory>
     */
    public static List<PropsItemMonsterCategory> allCategories() {

        TuSDKMonsterFaceWrap.TuSDKMonsterFaceType[] faceTypes =
                {
                        TuSDKMonsterFaceTypeBigNose, // 大鼻子
                        TuSDKMonsterFaceTypePapayaFace, // 木瓜脸
                        TuSDKMonsterFaceTypePieFace, // 大饼脸
                        TuSDKMonsterFaceTypeSmallEyes, // 眯眯眼
                        TuSDKMonsterFaceTypeSnakeFace, // 蛇精脸
                        TuSDKMonsterFaceTypeSquareFace, // 国字脸
                        TuSDKMonsterFaceTypeThickLips // 厚嘴唇
                };


        // 缩略图后缀
        String[] faceTypeTitles =
                {
                        "bignose",
                        "papaya",
                        "pie",
                        "smalleyes",
                        "snake",
                        "square",
                        "thicklips"
                };



        List<PropsItemMonsterCategory> categories = new ArrayList<>();
        List<PropsItemMonster> monsters = new ArrayList<>();

        for (int i = 0; i<faceTypes.length; i++) {

            PropsItemMonster monster = new PropsItemMonster(faceTypes[i]);
            monster.setThumbName(faceTypeTitles[i]);
            monsters.add(monster);
        }

        PropsItemMonsterCategory monsterCategory = new PropsItemMonsterCategory(monsters);
        monsterCategory.setName(TuSdkContext.getString(R.string.lsq_face_monster));
        categories.add(monsterCategory);

        return categories;
    }

5. 变声

  • 变调参数设置须在点击录制按钮前调用,支持断点录制下不同声调的变换
public void setSoundPitchType(TuSdkAudioPitchEngine.TuSdkSoundPitchType soundPitchType)
  • 支持的声调:正常,怪兽,大叔,女生,萝莉
public enum TuSdkSoundPitchType {
        //正常
        Normal,
        //怪兽
        Monster,
        //大叔
        Uncle,
        //女生
        Girl,
        //萝莉
        Lolita;
}

6. 快慢速控制

设置正常、快速、极快、慢速、极慢多种模式。

  • 设置快速模式
public void setSpeedMode(SpeedMode speedMode)
/** 速率模式 */
public enum SpeedMode
{
   NORMAL,  // 正常
   FAST1,  // 快速
   FAST2, // 极快
   Slow1,  // 慢速
   Slow2;    // 极慢

   private float mSpeedRate;

   SpeedMode(float speedRate)
   {
      this.mSpeedRate = speedRate;
   }

}

7. 美妆

设置口红,腮红,眉毛,眼影,眼线,睫毛效果

  • 初始化
TuSdkMediaCosmeticEffectData mEffect = new TuSdkMediaCosmeticEffectData();
  • 效果设置Api
class TuSdkMediaCosmeticEffectData{
    /**
     * 更新唇彩类型,颜色,透明度
     *
     * @param type     类型
     * @param colorRGB 颜色
     */
    public void updateLip(CosmeticLipFilter.CosmeticLipType type, int colorRGB)

    /**
     * 关闭唇彩效果
     */
    public void closeLip()

    /**
     * 更新腮红贴纸,透明度
     *
     * @param sticker
     */
    public void updateBlush(StickerData sticker)

     /**
     * 关闭腮红效果
     */
    public void closeBlush()

     /**
     * 更新眉毛贴纸,透明度
     *
     * @param sticker
     */
    public void updateEyebrow(StickerData sticker)

    /**
     * 关闭腮红效果
     */
    public void closeEyebrow()

    /**
     * 更新眼影贴纸,透明度
     *
     * @param sticker
     */
    public void updateEyeshadow(StickerData sticker)

    /**
     * 关闭眼影效果
     */
    public void closeEyeshadow()

    /**
     * 更新眼线贴纸,透明度
     *
     * @param sticker
     */
    public void updateEyeline(StickerData sticker)

    /**
     * 关闭眼线效果
     */
    public void closeEyeline()

    /**
     * 更新睫毛贴纸,透明度
     *
     * @param sticker
     */
    public void updateEyelash(StickerData sticker)

    /**
     * 关闭睫毛效果
     */
    public void closeEyelash()
}
  • 透明度调节

    透明度调节通过各部位对应的key进行调节,详细key请查看demo中CosmeticPanelController.java

  • 美妆贴纸在线部署

    美妆贴纸的在线部署方式与动态贴纸一致,可直接参考动态贴纸的在线部署方式

  • 1. 录制相机的使用
  • 1.3 相机采集配置
  • 1.4 相机设置
  • 2. 滤镜使用 (普通滤镜和漫画滤镜)
  • 3. 美颜,微整形的使用
  • 4. 道具模块(动态贴纸和哈哈镜)
  • 5. 变声
  • 6. 快慢速控制
  • 7. 美妆
  • 在线技术支持
  • 专业售前售后团队
  • 版本定期更新
  • 全方位解决方案

商务合作

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

关注我们

qrcode

©2019-2025 TUTUCLOUD. All Rights Reserved. 杭州元凡视觉智能科技有限公司 | 浙ICP备14040447号-1 | 浙公网安备33010602001649号

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