涂图

  • 首页
  • 解决方案
    • 拍照和图片编辑
    • 视频录制和后期编辑
    • 模板视频
    • 人像美颜
    • 人脸特效
    • 滤镜特效
    • 贴纸特效
  • 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 概述
    • 常见问题
      • 常见问题
  • 四、综合
  • 涂图隐私协议
  • 用户退出机制
  • 动态贴纸设计规范
  • 美妆贴纸设计规范
  • 云服务账单说明
  • 应用包名与密钥
  • 基础服务开发者升级流程
  • 五、常见问题
  • 常见问题
  • 遇到问题,怎么办?
  • 如何使用贴纸管理、滤镜管理?

直播相机的使用

创建直播相机对象

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

// 相机视图容器 
RelativeLayout cameraView = (RelativeLayout) findViewById(R.id.lsq_cameraView);

LiveVideoCamera videoCamera = new LiveVideoCamera(this.getBaseContext(), cameraView);

// 滤镜事件代理
videoCamera.setDelegate(mVideoCameraDelegate);

// 设置视频编码器委托
videoCamera.setVideoDataDelegate(mVideoDataDelegate);

// 设置音频编码器委托
videoCamera.setAudioDataDelegate(mAudioDataDelegate);

LiveVideoCamera 的构造方法中需要传入两个参数:

  • 当前上下文(Context)
  • 相机视图容器(RelativeLayout)

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

获取直播相机对象之后,使用 setDelegate(TuSDKVideoCameraDelegate) 方法设置滤镜事件代理,当滤镜效果发生变化的时候会回调该代理下的 onFilterChanged(SelesOutInput selesOutInput) 方法。

配置相机属性

获取直播相机对象后,可以对该相机的属性进行一些设置:

视频采集设置

使用 setVideoCaptureSetting(TuSDKVideoCaptureSetting) 接口可以指定采集时的配置, TuSDKVideoCaptureSetting 中可以对相机采集时的多项属性进行设置,包括:

  • facing,相机朝向(默认: CameraFacing.Front 前置)
  • videoSize,输出画面尺寸,仅当 videoAVCodecType == AVCodecType.CUSTOM_CODEC 时生效(默认:TuSdkSize(320, 480))
  • fps,采集帧率(默认:24)
  • videoAVCodecType,视频编码类型(默认: AVCodecType.HW_CODEC(硬编))
  • imageFormatType,输出帧数据的格式, 当 videoAVCodecType == AVCodecType.CUSTOM_CODEC 时生效,默认 ImageFormatType.NV21

其中 AVCodecType 定义如下:

/**
 * 音视频编码类型
 */
public static enum AVCodecType
{
    // 硬编
    HW_CODEC,
    // 软编
    SW_CODEC,
    // 自定义编码。输出帧数据,用户自定义编码
    CUSTOM_CODEC
}

开启智能美颜和动态贴纸

开启智能美颜和动态贴纸 (默认: false)。

因为性能原因,目前只能在硬编模式下才能使用动态贴纸:

this.setEnableFaceAutoBeauty(true);

开启音频采集

开启音频采集(默认:false)

setEnableAudioCapture(true);

设置为横屏

是否使用横屏采集(默认:竖屏)

setOutputImageOrientation(InterfaceOrientation.PortraitUpsideDown);

水平镜像前置摄像头

前置摄像头采集的内容是否需要水平镜像处理

setHorizontallyMirrorFrontFacingCamera(true);

设置数据回调接口

在创建相机对象时可以使用 setVideoCaptureSetting(TuSDKVideoCaptureSetting) 接口指定采集时的配置,其中该配置类下的 videoAVCodecType 属性代表了希望获取的数据是原始帧数据还是编码后的数据(软编或硬编)。

获取编码好的数据

当设置 videoAVCodecType 为 HW_CODEC 或是 SW_CODEC 类型时,SDK 会通过视频编码器委托中的回调将编码后的视频数据回传(硬编或软编),用户可以在回调接口中获取数据,如下:

/**
 * 视频编码器委托
 */
private TuSDKVideoDataEncoderDelegate mVideoDataDelegate = new TuSDKVideoDataEncoderDelegate() 
{   
    @Override
    public void onVideoEncoderStarted(MediaFormat format) 
    {
    }

    @Override
    public void onVideoEncoderFrameDataAvailable(long tms,ByteBuffer byteBuffer, BufferInfo bufferInfo) 
    {
    }
};

videoCamera.setVideoDataDelegate(mVideoDataDelegate);

同时,使用下面的方式获取编码后的音频数据(硬编或软编):

/**
 * 视频编码器委托
 */
private TuSDKVideoDataEncoderDelegate mVideoDataDelegate = new TuSDKVideoDataEncoderDelegate() 
{   
    @Override
    public void onVideoEncoderStarted(MediaFormat format) 
    {
    }

    @Override
    public void onVideoEncoderFrameDataAvailable(long tms,ByteBuffer byteBuffer, BufferInfo bufferInfo) 
    {
    }
};

videoCamera.setVideoDataDelegate(mVideoDataDelegate);

获取原始帧数据

当设置 videoAVCodecType 为 CUSTOM_CODEC 类型时,SDK 会通过帧数据委托中的回调将原始帧数据回传,用户可以在回调接口中获取数据并自行做编码操作,如下:

/**
 * 帧数据委托,videoAVCodecType == AVCodecType.CUSTOM_CODEC 时才会调用。
 * 
 * 输出每桢的数据
 */
private TuSDKLiveVideoCameraDelegate mFrameDelegate = new TuSDKLiveVideoCameraDelegate()
{
    @Override
    public void onFrameDataAvailable(byte[] frameData)
    {
        TLog.d("Frame data ready");

        // 将转换后的 frameData 用于视频编码
        // 软编:编码 -> 推流
    }
};

this.setFrameDelegate(mFrameDelegate);

同时用户可以通过设置 imageFormatType 的值来指定输出的帧数据的格式,如下:

    TuSDKVideoCaptureSetting captureSetting = new TuSDKVideoCaptureSetting();
    captureSetting.imageFormatType = ImageFormatType.NV21;

其中 ImageFormatType 定义如下:

/**
 * videoAVCodecType == CUSTOM_CODEC 时输出的帧数据格式
 */
public static enum ImageFormatType
{
    NV21,
    YV12,
    I420
}

开启推流

创建推流实例对象

创建并配置推流实例对象,如下:

// 配置 LiveEngine,推流之前 fps 和 videoSize 将作为 MetaData 数据发送至服务器
TuSDKLiveEngineSetting liveSettings = TuSDKLiveEngineSetting.defaultSetting();
liveSettings.fps = getVideoEncoderSetting().videoQuality.getFps();
liveSettings.videoSize = getVideoEncoderSetting().videoSize;

TuSDKLiveEngine mLiveEngine = TuSDKLiveEngine.create(liveSettings);

其中 TuSDKLiveEngineSetting 是 TuSDKLiveEngine 类的配置参数类,可以通过该类指定推流时的一些参数:

  • fps,帧率
  • videoSize,画面尺寸
  • adaptiveBitrateEnable,是否开启自适应码率
  • streamingMeterTimeGranularity,直播流统计时长粒度,单位:毫秒,默认:3000,即每三秒统计一次
  • streamingMessageMaxQueueLength,推流消息队列最大长度,默认:150

设置推流状态回调

获取推流实例对象之后,可以通过 setEngineEventHandler(TuSDKLiveEngineEventHandler) 接口设置推流状态改变时的回调方法,如下:

mLiveEngine.setEngineEventHandler(new TuSDKLiveEngineEventHandler()
{
    @Override
    public void onStreamingStateChanged(StreamingState state)
    {
        // 流状态改变
    }

    @Override
    public void onConnectStateChanged(ConnectState state)
    {
        // 连接状态改变
    }

    @Override
    public TuSDKLiveVideoQuality settingVideoQuality()
    {
        // 返回当前编码器设置的视频质量
        return null;
    }

    @Override
    public boolean onRequestUpdateVideoQuality(AdapterResult arg0)
    {
        // 根据当前推流状态请求更新视频画质
        return false;
    }
});

启动推流

当相机对象调用了 startRecording() 方法之后才会有数据从回调方法中返回,因此可以把启动推流的代码放在 startRecording() 方法中,如下:

String RTMPURL;

@Override
public void startRecording() 
{
    super.startRecording();
    mLiveEngine.startStreaming(RTMPURL);
}

其中使用 startStreaming(String rtmpAddress) 方法设置推流地址并开启推流。

使用下面的方式结束推流:

@Override
public void stopRecording() 
{
    super.stopRecording();
    mLiveEngine.stopStreaming();
}

推送音视频数据

当设置 videoAVCodecType 为 HW_CODEC 或是 SW_CODEC 类型时,编码后的音视频数据都会通过设置的回调方法返回,可以在回调方法中使用 sendFrame(TuSDKLiveRTMPData frame) 接口将数据推到服务器,如下:

/**
 * 视频编码器委托
 */
private TuSDKVideoDataEncoderDelegate mVideoDataDelegate = new TuSDKVideoDataEncoderDelegate() 
{   
    @Override
    public void onVideoEncoderStarted(MediaFormat format) 
    {
        TuSDKLiveRTMPData rtmpData = TuSDKLiveRTMPData.videoDataHeader(format);
        mLiveEngine.sendFrame(rtmpData);
    }

    @Override
    public void onVideoEncoderFrameDataAvailable(long tms,ByteBuffer byteBuffer, BufferInfo bufferInfo) 
    {
        TuSDKLiveRTMPData rtmpData = TuSDKLiveRTMPData.videoFrameData(tms, byteBuffer, bufferInfo);
        mLiveEngine.sendFrame(rtmpData);
    }
};

/**
 * 音频编码器委托
 */
private TuSDKAudioDataEncoderDelegate mAudioDataDelegate = new TuSDKAudioDataEncoderDelegate()
{

    @Override
    public void onAudioEncoderStarted(MediaFormat format) {
        TuSDKLiveRTMPData rtmpData = TuSDKLiveRTMPData.audioDataHeader(format);
         mLiveEngine.sendFrame(rtmpData);
    }

    @Override
    public void onAudioEncoderFrameDataAvailable(long tms, ByteBuffer byteBuffer, BufferInfo bufferInfo) {
        TuSDKLiveRTMPData rtmpData = TuSDKLiveRTMPData.audioFrameData(tms, byteBuffer, bufferInfo);
        mLiveEngine.sendFrame(rtmpData);
    }
};

滤镜接口

获取滤镜代号

可以在下载的资源文件中找到 lsq_tusdk_configs.json 文件,之前在控制台所打包的滤镜资源会在这个文件中显示,比如"name":"lsq_filter_VideoFair",则该滤镜的 filterCode 即为 VideoFair,需注意大小写。

以 demo 为例,可以将此 filterCode 设置在 SimpleCameraActivity.java 文件的滤镜数组中,如下:

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

如果有多款滤镜,分别取得滤镜对应的 filterCode 放到上面的数组中即可。

关于滤镜更多介绍,可以参看「自定义滤镜」文档。

加载并显示滤镜资源

创建的滤镜代号数组中,每一个字符串都代表一个滤镜的 filterCode,将数组通过 mFilterListView.setModeList(List<String>) 的方式传给 FilterListView 类,然后在 FilterCellView 类中的 bindModel() 方法中通过 filterCode 获取滤镜对应的缩略图,并将该缩略图显示在该项滤镜视图上面。

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

同时用户也可以使用自己的列表来显示滤镜,并可以自定义滤镜的缩略图(替换掉对应名称的图片即可)。

添加滤镜效果

在 demo 中,点击滤镜项会调用 onFilterGroupSelected() 方法,在该方法中调用 tuSDKVideoCamera.switchFilter(filterCode) 方法即可切换滤镜效果。

默认开启滤镜效果

可以设置打开相机时默认开启滤镜效果,实现如下:

@Override
protected void onCameraStarted()
{
    super.onCameraStarted();

    // 开机启动美颜
    switchFilter("VideoFair");
}

即重写 TuSDKLiveVideoCamera 类中的 onCameraStarted() 方法,并调用 switchFilter(String) 方法即可。

贴纸接口

加载并显示贴纸资源

动态贴纸资源可以通过StickerLocalPackage.shared().getSmartStickerGroups() 方法获取,并返回一个 List<StickerGroup>类型的返回值,里面包含着所有打包下载到本地的动态贴纸资源。

跟加载滤镜资源不一样,加载贴纸资源时使用的是从打包下载的资源文件中读取的贴纸缩略图,然后通过 mStickerListView.setModeList(groups) 方法将贴纸资源传给 StickerListView 类中,最后在 StickerCellView 类中的 bindModel() 方法中使用 StickerLocalPackage.shared().loadGroupThumb(StickerGroup data, ImageView posterView) 接口将贴纸缩略图绑定到对应视图上。

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

同时用户也可以使用自己的列表来显示贴纸,参考 demo 中的实现。

添加贴纸效果

在 demo 中,点击贴纸栏会调用 onStickerGroupSelected() 方法,在该方法中调用 showGroupSticker(StickerGroup) 方法显示传入的贴纸,使用 removeAllLiveSticker() 方法取消动态贴纸效果。

  • 创建直播相机对象
  • 配置相机属性
  • 设置数据回调接口
  • 开启推流
  • 滤镜接口
  • 贴纸接口
  • 在线技术支持
  • 专业售前售后团队
  • 版本定期更新
  • 全方位解决方案

商务合作

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

关注我们

qrcode

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

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