涂图

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

视频编辑的使用

Demo中视频编辑的Activity流程为

  1. MovieAlbumActivity 视频选择页面
  2. MovieEditorCutActivity 视频编辑-裁剪页面
  3. MovieEditorActivity 视频编辑页面

1.相册导入视频

类名 功能说明
MovieAlbumActivity 对视频列表进行选择

其中需要说明这几个参数

/* 最小视频时长(单位:ms) */
private static int MIN_VIDEO_DURATION = 3000;
/* 最大视频时长(单位:ms) */
private static int MAX_VIDEO_DURATION = 60000;
/** 最大边长限制 **/
private static final int MAX_SIZE = 3840;

最大边长限制,我们限制在了4K以下,因为不同的厂商的手机对4K的支持不同,我们统一限制视频为4K以下的视频可以编辑

2.视频裁剪

类名 功能说明
MovieEditorCutActivity 编辑-裁剪页面
TuSdkMediaMutableFilePlayer 视频播放器(支持多文件)
TuSdkMediaFilesCuterImpl 裁剪器(支持多文件)
TuSdkVideoImageExtractor 封面抽取(支持多文件)
  • 传入视频路径列表

进入MovieEditorCutActivity需要在打开这个activity的时候通过Bundle 传入视频路径,SerializableExtr的name为videoPaths

  • 获取视频裁剪栏缩略图,用于裁剪栏的展示。
    /** 加载视频缩略图 */
    public void loadVideoThumbList() {

        List<TuSdkMediaDataSource> sourceList = new ArrayList<>();

        for (MovieInfo movieInfo : mVideoPaths)
            sourceList.add(TuSdkMediaDataSource.create(movieInfo.getPath()).get(0));

        /** 准备视频缩略图抽取器 */
        final TuSdkVideoImageExtractor imageThumbExtractor = new TuSdkVideoImageExtractor(sourceList);
        imageThumbExtractor
               //.setOutputImageSize(TuSdkSize.create(50,50)) // 设置抽取的缩略图大小
                .setExtractFrameCount(20) // 设置抽取的图片数量
                .setImageListener(new TuSdkVideoImageExtractorListener() {

                    /**
                     * 输出一帧略图信息
                     *
                     * @param videoImage 视频图片
                     * @since v3.2.1
                     */
                    public void onOutputFrameImage(final TuSdkVideoImageExtractor.VideoImage videoImage) {
                        ThreadHelper.post(new Runnable() {
                            @Override
                            public void run() {
                                mEditorCutView.addBitmap(videoImage.bitmap);
                                if(!isSetDuration) {
                                    float duration = mVideoPlayer.durationUs() / 1000000.0f;
                                    mEditorCutView.setRangTime(duration);
                                    mEditorCutView.setTotalTime(mVideoPlayer.durationUs());
                                    if(duration >0)
                                    isSetDuration = true;
                                }
                                mEditorCutView.setMinCutTimeUs(mMinCutTimeUs/(float)mDurationTimeUs);
                            }
                        });
                    }

                    /**
                     * 抽取器抽取完成
                     *
                     * @since v3.2.1
                     */
                    @Override
                    public void onImageExtractorCompleted(List<TuSdkVideoImageExtractor.VideoImage> videoImagesList) {
                        /** 注意: videoImagesList 需要开发者自己释放 bitmap */
                        imageThumbExtractor.release();

                    }
                 })
                .extractImages(); // 抽取图片

    }
  • 裁剪控制器会对视频本身进行裁剪处理,导出视频并保存到临时文件夹中,用户可自定义处理。
    /**
     * 开始合成视频
     */
    private void startCompound(){
        if (cuter != null) {
            return;
        }

        isCutting = true;

        List<TuSdkMediaDataSource> sourceList = new ArrayList<>();

        // 遍历视频源
        for (MovieInfo movieInfo : mVideoPaths) {
            sourceList.add(TuSdkMediaDataSource.create(movieInfo.getPath()).get(0));
        }
        // 准备切片时间
        TuSdkMediaTimeSlice tuSdkMediaTimeSlice = new TuSdkMediaTimeSlice(mLeftTimeRangUs,mRightTimeRangUs);
        tuSdkMediaTimeSlice.speed = mVideoPlayer.speed();

        // 准备裁剪对象
        cuter = new TuSdkMediaFilesCuterImpl();
        // 设置裁剪切片时间
        cuter.setTimeSlice(tuSdkMediaTimeSlice);
        // 设置数据源
        cuter.setMediaDataSources(sourceList);
        // 设置文件输出路径
        cuter.setOutputFilePath(getOutputTempFilePath().getPath());

        // 准备视频格式
        MediaFormat videoFormat = TuSdkMediaFormat.buildSafeVideoEncodecFormat( cuter.preferredOutputSize().width,  cuter.preferredOutputSize().height,
                30, TuSdkVideoQuality.RECORD_MEDIUM2.getBitrate(), MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface, 0, 0);


        // 设置视频输出格式
        cuter.setOutputVideoFormat(videoFormat);
        // 设置音频输出格式
        cuter.setOutputAudioFormat(TuSdkMediaFormat.buildSafeAudioEncodecFormat());

        // 开始裁剪
        cuter.run(new TuSdkMediaProgress() {
            /**
             *  裁剪进度回调
             * @param progress        进度百分比 0-1
             * @param mediaDataSource 当前处理的视频媒体源
             * @param index           当前处理的视频索引
             * @param total           总共需要处理的文件数
             */
            @Override
            public void onProgress(final float progress, TuSdkMediaDataSource mediaDataSource, int index, int total) {
                ThreadHelper.post(new Runnable() {
                    @Override
                    public void run() {
                        mLoadContent.setVisibility(View.VISIBLE);
                        mLoadProgress.setValue(progress * 100);
                    }
                });
            }

            /**
             *  裁剪结束回调
             * @param e 如果成功则为Null
             * @param outputFile 输出文件路径
             * @param total 处理文件总数
             */
            @Override
            public void onCompleted(Exception e, TuSdkMediaDataSource outputFile, int total) {
                isCutting = false;
                ThreadHelper.post(new Runnable() {
                    @Override
                    public void run() {
                        setEnable(true);
                        mLoadContent.setVisibility(View.GONE);
                        mLoadProgress.setValue(0);
                        mPlayBtn.setVisibility(mVideoPlayer.isPause()?View.VISIBLE:View.GONE);
                    }
                });
                Intent intent = new Intent(MovieEditorCutActivity.this,MovieEditorActivity.class);
                intent.putExtra("videoPath", outputFile.getPath());
                startActivity(intent);
                cuter = null;
            }
        });
    }
  • 视频裁剪可以对输出视频设置时间范围、画布裁剪、图像裁剪等,示例如下:
// 设置裁剪切片
public void setTimeSlice(TuSdkMediaTimeSlice slice)
// 设置数据源
public final void setMediaDataSources(List<TuSdkMediaDataSource> mediaDataSources) 
// 设置输出文件路径
public void setOutputFilePath(String filePath)
// 设置输出视频格式
public int setOutputVideoFormat(MediaFormat videoFormat)
// 设置输出音频格式
public int setOutputAudioFormat(MediaFormat audioFormat)
// 进行裁剪
public boolean run(TuSdkMediaProgress progress)

裁剪的回调为

/** 媒体处理进度接口 */
public interface TuSdkMediaProgress {
    /**
     * 执行进度 [主线程]
     *
     * @param progress        进度百分比 0-1
     * @param mediaDataSource 当前处理的视频媒体源
     * @param index           当前处理的视频索引
     * @param total           总共需要处理的文件数
     */
    void onProgress(float progress, TuSdkMediaDataSource mediaDataSource, int index, int total);

    /***
     * 完成转码 [主线程]
     * @param e 如果成功则为Null
     * @param outputFile 输出文件路径
     * @param total 处理文件总数
     */
    void onCompleted(Exception e, TuSdkMediaDataSource outputFile, int total);
}

3.视频编辑

由MovieEditorCutActivity 转码后,进入了视频编辑MovieEditorActivity页面,

类名 功能描述
MovieEditorActivity 视频编辑页面
MovieEditorController 视频编辑控制器
TuSdkMovieEditor 视频编辑器

视频编辑的功能是由TuSdkMovieEditor 提供,Demo界面以及相关操作,都在MovieEditorController里以操作组件的方式封装

  • 视频编辑控制器的结构与组成
类名 功能描述
EditorHomeComponent 视频编辑主页面组件
EditorFilterComponent 滤镜效果组件
EditorMVComponent MV效果组件
EditorMusicComponent 配音效果组件
EditorTextComponent 文字效果组件
EditorEffectComponent 特效组件(包括场景特效、时间特效、魔法特效)
EditorEffectTransitionsComponent 转场特效组件
EditorStickerComponent 图片贴纸组件
EditorTrimComponent 视频裁剪组件

3.1 视频编辑器的初始化

在MovieEditorController 的构造方法中需要初始化视频编辑器,以下是一个最简单的视频加载逻辑。

    /**
    * context 当前context
    * holderView 视频播放器的父容器
    * options 视频配置项
    **/
    TuSdkMovieEditor mMovieEditor = new TuSdkMovieEditorImpl(context, holderView, options);
    //之前经历过MovieEditorCutActivity裁剪加载 则不用开启转码
    mMovieEditor.setEnableTranscode(false);
    //加载视频
    mMovieEditor.loadVideo();

接口描述:

  • 设置转码
    /**
     * 是否开启转码
     *
     * @param isEnableTranscode true 开启 false 不开启 默认开启
     */
    public void setEnableTranscode(boolean isEnableTranscode);
  • 加载视频
    /**
     * 加载视频
     *
     * @since 3.0
     */
    void loadVideo();
  • 保存视频
    /**
     * 保存视频
     *
     * @since 3.0
     */
    void saveVideo();

3.1.1视频编辑配置项中可配置的参数:

简单使用方式如下:

    TuSdkMovieEditor.TuSdkMovieEditorOptions defaultOptions = TuSdkMovieEditor.TuSdkMovieEditorOptions.defaultOptions();
    defaultOptions
        // 设置视频数据源
        .setVideoDataSource(new TuSdkMediaDataSource(mVideoPath))
        // 设置是否保存或者播放原音
        .setIncludeAudioInVideo(true) 
        // 设置MovieEditor销毁时是否自动清除缓存音频解码信息
        .setClearAudioDecodeCacheInfoOnDestory(false)
        // 设置时间线模式
        .setPictureEffectReferTimelineType(TuSdkMediaEffectReferInputTimelineType)
        // 设置水印
        .setWaterImage(BitmapHelper.getBitmapFormRaw(this, R.raw.sample_watermark), TuSdkWaterMarkOption.WaterMarkPosition.TopRight, true);

接口描述:

  • 设置视频数据源
public TuSdkMovieEditorOptions setVideoDataSource(TuSdkMediaDataSource videoDataSource);
  • 设置影片保存路径
 public TuSdkMovieEditorOptions setMovieOutputFilePath(File movieOutputFilePath);
  • 设置视频裁剪区域
public TuSdkMovieEditorOptions setCutTimeRange(TuSDKTimeRange cutTimeRange);
  • 设置画布裁剪区域
public TuSdkMovieEditorOptions setCanvasRectF(RectF canvasRect);
  • 设置是否保存视频原音 默认 true
public TuSdkMovieEditorOptions setIncludeAudioInVideo(boolean includeAudioInVideo);
  • 设置视频画面特效参照时间线类型
public TuSdkMovieEditorOptions setPictureEffectReferTimelineType(TuSdkMediaPictureEffectReferTimelineType timelineType);
  • 设置视频输出的宽高
public TuSdkMovieEditorOptions setOutputSize(TuSdkSize outputSize);
  • 设置是否将视频保存到相册 默认:true
public TuSdkMovieEditorOptions setSaveToAlbum(Boolean saveToAlbum);
  • 保存到系统相册的相册名称 (saveToAlbum 为true时可用)
public TuSdkMovieEditorOptions setSaveToAlbumName(String saveToAlbumName);
  • MovieEditor销毁时是否自动清除音频缓存信息(默认:false 设置为false下次再次使用时可加快载入速度)
public TuSdkMovieEditorOptions setClearAudioDecodeCacheInfoOnDestory(boolean clearAudioDecodeCacheInfoOnDestory);
  • 设置水印图片
/**
* waterImage          水印图片 (Bitmap)
* watermarkPosition   水印的位置
* isRecycleWaterImage 是否回收水印图片(Bitmap)
**/
public TuSdkMovieEditorOptions setWaterImage(Bitmap waterImage, TuSdkWaterMarkOption.WaterMarkPosition watermarkPosition, boolean isRecycleWaterImage)

3.1.2 视频编辑的API组成与特效数据类

视频编辑TuSdkMovieEditor 中由一下几个组件组成,调用的时候通过一下不同的功能组件调用不同的API

  1. TuSdkEditorTranscoder转码器 如果没有预转码或者开启了转码,则由此转码器进行视频的裁剪与处理
  2. TuSdkEditorPlayer 播放器 编辑内的播放器,负责控制时间特效,以及相关播放的API
  3. TuSdkEditorEffector 特效器 负责特效 添加 删除相关的API
  4. TuSdkEditorAudioMixer混音器 混音相关的API
  5. TuSdkEditorSaver 保存器 最后保存视频的相关API

相关特效分为普通特效和时间特效两种 普通特效:

特效类名 功能描述
TuSDKMediaTextEffectData 文字贴纸特效
TuSDKMediaParticleEffectData 魔法特效
TuSDKMediaStickerAudioEffectData MV特效
TuSDKMediaFilterEffectData 滤镜效果
TuSDKMediaStickerEffectData 贴纸特效
TuSDKMediaAudioEffectData 配音特效
TuSDKMediaSceneEffectData 场景特效
TuSDKMediaComicEffectData 卡通特效
TuSdkMediaTransitionEffectData 转场特效
TuSdkMediaStickerImageEffectData 图片贴纸特效

上述特效由TuSdkEditorEffector 特效器进行添加 、删除的操作,下列三种是时间特效,由TuSdkEditorPlayer管理

特效类名 功能描述
TuSDKMediaReversalTimeEffect 倒序时间特效
TuSDKMediaRepeatTimeEffect 反复时间特效
TuSDKMediaSlowTimeEffect 慢动作时间特效

3.2 视频编辑特效的使用

3.2.1 视频编辑滤镜使用

在EditorFilterComponent中mFilterRecyclerView的Item点击回调内,回去到当前点击的滤镜的code(通过mFilterRecyclerAdapter.setFilterList(filterList)设置)

  • 滤镜列表,获取滤镜前往 TuSDK.bundle/others/lsq_tusdk_configs.json

  • TuSDK 滤镜信息介绍 @see-https://tusdk.com/docs/image-android/customize-filter

TuSDKMediaFilterEffectData mediaFilterEffectData = new TuSDKMediaFilterEffectData(code);
getMovieEditor().getEditorEffector().addMediaEffectData(filterEffectData);

滤镜的改变回调可以通过TuSdkEditorEffector 来设置

//设置滤镜改变的回调
getEditorEffector().setFilterChangeListener(mFilterChangeListener);

3.2.2 视频编辑MV使用

在EditorMVComponent中的mMvRecyclerView的Item点击回调内

/*********************  添加  *************/
 if (mMusicMap != null && mMusicMap.containsKey(groupId)) {
    //带音效的MV
    Uri uri = Uri.parse("android.resource://" + getEditorController().getActivity().getPackageName() + "/" + mMusicMap.get(groupId));
   //创建MV数据类
    TuSDKMediaStickerAudioEffectData stickerAudioEffectDat = new TuSDKMediaStickerAudioEffectData(new TuSdkMediaDataSource(context, uri), itemData);
     //设置时间范围
    stickerAudioEffectDat.setAtTimeRange(TuSDKTimeRange.makeRange(0, Float.MAX_VALUE));
    //设置MV的背景音效是否循环播放
    stickerAudioEffectDat.getMediaAudioEffectData().getAudioEntry().setLooping(true);
    //添加MV效果
    getEditorEffector().addMediaEffectData(stickerAudioEffectDat);

} else {
    //纯贴纸的MV
    TuSDKMediaStickerEffectData stickerEffectData = new TuSDKMediaStickerEffectData(itemData);
    //设置时间范围
    stickerEffectData.setAtTimeRange(TuSDKTimeRange.makeRange(0, Float.MAX_VALUE));
    //添加MV效果
    getMovieEditor().getEditorEffector().addMediaEffectData(stickerEffectData);
 }

3.2.3 视频编辑配乐使用

在EditorMusicComponent中的mMusicRecycle的Item点击中

//创建音频特效对象
TuSDKMediaAudioEffectData audioEffectData = new TuSDKMediaAudioEffectData(new TuSdkMediaDataSource(context, audioPathUri));
//设置时间
audioEffectData.setAtTimeRange(TuSDKTimeRange.makeTimeUsRange(0,   getEditorPlayer().getOutputTotalTimeUS()));

加载音频回调是在混音器中加入

getEditorMixer().addTaskStateListener(mAudioDecoderTask);

回调的状态有

/**
 * 当前执行类状态
 */
public enum State {
    /** 空闲状态 **/
    Idle,
    /** 正在解码 **/
    Decoding,
    /** 解码完成 **/
    Complete,
    /** 已取消  **/
    Cancelled
}

音频录音回调

/**
 * 录音裁剪进度监听
 */
public interface OnAudioRecordCuterListener {
    /**
     * 当前执行的进度
     *
     * @param percent       当前进度的百分比 (0 ~ 1)
     * @param currentTimeUS 当前执行的时间(微秒)
     * @param totalTimeUS   总时长 (微秒)
     */
    void onProgressChanged(float percent, long currentTimeUS, long totalTimeUS);

    /**
     * 输出完毕
     *
     * @param outputFile 输出完成的文件
     */
    void onComplete(File outputFile);

}

3.2.4 视频编辑文字使用

文字功能在EditorTextComponent 中,添加一个文字特效

/**
 * 将数据转成公用的 TuSDKMediaEffectData
 *
 * @param sticker     贴纸数据
 * @param bitmap      文字生成的图片
 * @param offsetX     相对视频左上角X轴的位置
 * @param offsetY     相对视频左上角Y轴的位置
 * @param rotation    旋转的角度
 * @param startTimeUs 文字特效开始的时间
 * @param stopTimeUs  文字特效结束的时间
 * @param stickerSize 当前StickerView的宽高(计算比例用)
*/
//创建一个文字贴纸包装类
TuSDKTextStickerImage stickerImage = new TuSDKTextStickerImage();
//创建文字贴纸数据类
TextStickerData stickerData = new TextStickerData(bitmap, bitmap.getWidth(), bitmap.getHeight(), 0, offsetX, offsetY, rotation);
stickerImage.setCurrentSticker(stickerData);
//设置设计画布的宽高
stickerImage.setDesignScreenSize(stickerSize);
//创建文字特效类
TuSDKMediaTextEffectData mediaTextEffectData = new TuSDKMediaTextEffectData(stickerImage);
//设置当前文字特效的时间
mediaTextEffectData.setAtTimeRange(TuSDKTimeRange.makeTimeUsRange(startTimeUs, stopTimeUs
//添加特效
getEditorEffector().addMediaEffectData(textMediaEffectData)

3.2.5 视频编辑特效使用

特效里分为场景特效 、 时间特效、魔法特效 三种,在EditorEffectComponent中,分为三个Fragment

  1. ScreenEffectFragment场景特效Fragment
  2. TimeEffectFragment 时间特效Fragment
  3. MagicEffectFragment 魔法特效Fragment

3.2.5.1 场景特效

添加一个场景特效

//创建一个场景特效数据类
TuSDKMediaSceneEffectData mediaSceneEffectData = new TuSDKMediaSceneEffectData(mScreenCode);
//设置场景特效的时间
mediaSceneEffectData.setAtTimeRange(TuSDKTimeRange.makeTimeUsRange(starTimeUs, endTimeUs));
//添加当前场景特效
getEditorEffector().addMediaEffectData(mediaSceneEffectData);

删除一个场景特效

getEditorEffector().removeMediaEffectData(mediaEffectData);

3.2.5.2 时间特效

  • 反复特效
//实例化反复特效数据类
TuSDKMediaRepeatTimeEffect repeatTimeEffect = new TuSDKMediaRepeatTimeEffect();
//设置开始与结束的时间范围
repeatTimeEffect.setTimeRange(startTimeUS, endTimeUS);
//设置反复的次数
repeatTimeEffect.setRepeatCount(2);
//是否裁剪多余的时间 
repeatTimeEffect.setDropOverTime(false);
//应用时间特效
getEditorPlayer().setTimeEffect(repeatTimeEffect);
  • 慢动作
//实例化慢动作特效数据
TuSDKMediaSlowTimeEffect slowTimeEffect = new TuSDKMediaSlowTimeEffect();
//设置慢动作的时间范围
slowTimeEffect.setTimeRange(startTimeUS, endTimeUS);
//设置慢动作的速率
slowTimeEffect.setSpeed(0.6f);
//应用时间特效
getEditorPlayer().setTimeEffect(slowTimeEffect);
  • 时光倒流
//实例化时光倒流特效数据
TuSDKMediaReversalTimeEffect reversalTimeEffect = new TuSDKMediaReversalTimeEffect();
//应用时间特效
getEditorPlayer().setTimeEffect(reversalTimeEffect);
  • 清除时间特效
getEditorPlayer().clearTimeEffect();

3.2.5.3 魔法特效

  • 魔法特效的添加
//实例化魔法效果
TuSDKMediaParticleEffectData effectModel = new TuSDKMediaParticleEffectData(mCurrentMagicCode);
//设置粒子大小
effectModel.setSize(mMagicConfig.getSize());
//设置粒子颜色
effectModel.setColor(mMagicConfig.getColor());   
//设置粒子位置(持续的移动不断的put 参考Demo中的MagicEffectFragment)
effectModel.putPoint(getEditorPlayer().getCurrentTimeUs(), pointF);
//预览魔法特效
getEditorEffector().addMediaEffectData(effectModel);

3.2.6 视频编辑转场特效的使用

转场特效功能在EditorEffectTransitionsComponent 中,添加一个转场特效

  • 转场特效类型枚举

    /** 转场特效类型枚举 */
    public enum TuSDKMediaTransitionType{
        /** 转场 - 淡入  @since v3.4.1 */
        TuSDKMediaTransitionTypeFadeIn,
        /** 转场 - 飞入  @since v3.4.1 */
        TuSDKMediaTransitionTypeFlyIn,
        /** 转场 - 拉入--右侧进入  @since v3.4.1 */
        TuSDKMediaTransitionTypePullInRight,
        /** 转场 - 拉入--左侧进入  @since v3.4.1 */
        TuSDKMediaTransitionTypePullInLeft,
        /** 转场 - 拉入--顶部进入  @since v3.4.1 */
        TuSDKMediaTransitionTypePullInTop,
        /** 转场 - 拉入--底部进入  @since v3.4.1 */
        TuSDKMediaTransitionTypePullInBottom,
        /** 转场 - 散步进入  @since v3.4.1 */
        TuSDKMediaTransitionTypeSpreadIn,
        /** 转场 - 闪光灯  @since v3.4.1 */
        TuSDKMediaTransitionTypeFlashLight,
        /** 转场 - 翻页  @since v3.4.1 */
        TuSDKMediaTransitionTypeFlip,
        /** 转场 - 聚焦-小到大  @since v3.4.1 */
        TuSDKMediaTransitionTypeFocusOut,
        /** 转场 - 聚焦-大到小 @since v3.4.1 */
        TuSDKMediaTransitionTypeFocusIn,
        /** 转场 - 叠起 @since v3.4.1 */
        TuSDKMediaTransitionTypeStackUp,
        /** 转场 - 缩放 @since v3.4.1 */
        TuSDKMediaTransitionTypeZoom
    }
  • 转场特效添加
//创建一个转场特效数据类,接收一个TuSDKMediaTransitionType类型的枚举
TuSdkMediaTransitionEffectData mediaTransitionEffectData = new TuSdkMediaTransitionEffectData(TuSDKMediaTransitionType);
//设置转场特效开始与结束时间
mediaTransitionEffectData.setAtTimeRange(TuSDKTimeRange.makeTimeUsRange(starTimeUs, endTimeUs));
//设置转场特效持续时间
mediaTransitionEffectData.getFilterArg("duration").setValue(durationUs);
mediaTransitionEffectData.submitParameters();
//预览转场特效
getEditorEffector().addMediaEffectData(mediaTransitionEffectData);

3.2.7 图片贴纸特效的使用

图片贴纸特效功能在EditorStickerComponent中, 添加图片贴纸

  • 创建贴纸数据对象
//创建一个贴纸数据对象
StickerImageData imageData = new StickerImageData();
//设置要显示的图片Bitmap
imageData.setImage(bitmap);
//设置图片的高度
imageData.height =  TuSdkContext.px2dip(bitmap.getHeight());
//设置图片的宽度
imageData.width = TuSdkContext.px2dip(bitmap.getWidth());
//设置图片开始显示时间
imageData.starTimeUs = 0;
//设置图片结束显示时间
imageData.stopTimeUs = 2 * 1000000;
//添加贴纸数据对象
getEditorController().getActivity().getImageStickerView().appendSticker(imageData);
  • 将贴纸数据对象转换为实际的图片贴纸特效对象
    /**
     * 将数据转成公用的 TuSdkMediaEffectData
     *
     * @param bitmap      图片
     * @param displaySize 图片显示的大小
     * @param offsetX     相对视频左上角X轴的位置
     * @param offsetY     相对视频左上角Y轴的位置
     * @param rotation    旋转的角度
     * @param startTimeUs 特效开始的时间
     * @param stopTimeUs  特效结束的时间
     * @param stickerSize 当前StickerView的宽高(计算比例用)
     * @return
     */
    protected TuSdkMediaStickerImageEffectData createTileEffectData(Bitmap bitmap, TuSdkSize displaySize, float offsetX, float offsetY, float rotation, long startTimeUs, long stopTimeUs ,TuSdkSize stickerSize) {
        TuSdkMediaStickerImageEffectData mediaTextEffectData = new TuSdkMediaStickerImageEffectData(bitmap,offsetX,offsetY,rotation,displaySize,stickerSize);
        mediaTextEffectData.setAtTimeRange(TuSdkTimeRange.makeTimeUsRange(startTimeUs, stopTimeUs));
        return mediaTextEffectData;
    }
//添加贴纸特效对象
getEditorEffector().addMediaEffectData(createTileEffectData());

3.2.8 视频裁剪功能

视频裁剪功能在EditorTrimComponent中

//设置视频裁剪输出比例,ratio 为 float类型的输出比例,enableClip 为 是否裁剪画面 true 超出比例外的部分会被裁剪掉 false 整个画面缩到预定的比例大小里
getEditorPlayer().setOutputRatio(float ratio, boolean enableClip);

3.3 保存视频

保存视频调用TuSdkMovieEditor.saveVideo(),保存的回调可以在saveVieo() 之前向保存器内添加回调

getEditorSaver().addSaverProgressListener(mSaveProgressListener);

该回调为

//保存进度监听
interface TuSdkSaverProgressListener {
    /**
     * 当前进度
     *
     * @param progress
     * @since v3.0
     */
    void onProgress(float progress);

    /**
     * 保存完成
     *
     * @param outputFile
     * @since v3.0
     */
    void onCompleted(TuSdkMediaDataSource outputFile);

    /**
     * 保存错误
     *
     * @param e
     * @since v3.0
     */
    void onError(Exception e);
}

  • 1.相册导入视频
  • 2.视频裁剪
  • 3.视频编辑
  • 在线技术支持
  • 专业售前售后团队
  • 版本定期更新
  • 全方位解决方案

商务合作

  • 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