短视频SDK提供视频编辑与导出功能,支持视频图片素材混合导入、提供滤镜、配音、时间特效、过渡效果等丰富的编辑效果。

版本差异

版本 功能描述
专业版 支持所有功能。
标准版 支持除字幕、动图、MV外的其他功能。
基础版 不支持导入和编辑功能。

编辑流程

编辑流程 流程说明
导入视频 该模块相关接口可以用来在编辑开始前组装视频源,获取编辑初始化需要的URI路径。
配置参数 该模块相关接口用来创建和销毁编辑器,根据第一步生成的URI路径,创建编辑器。
开始编辑 该模块相关接口可以用来在编辑过程中动态裁剪视频、动态更换视频源、动态调整视频转场时间及转场效果。编辑核心类是AliyunIEditor类。
设置特效 该模块接口用来编辑滤镜效果、动效滤镜(灵魂出窍等)效果、动图效果等。
预览控制 该模块相关接口用来控制编辑器的预览播放。
合成输出 该模块相关接口用来控制合成输出。

导入视频

配置项 配置实例
导入添加视频/照片
AliyunIImport.addMediaClip(AliyunClip clip);
导入移除视频/照片
AliyunIImport.removeMedia(int id);
导入更换顺序
AliyunIImport.swap(int pos1, int pos2);
导入生成视频源配置文件
AliyunIImport.generateProjectConfigure();
导入设置合成输出参数(帧率、码率、GOP、输出分辨率、编码器、质量等级、画面模式)
AliyunIImport.setVideoParam(AliyunVideoParam param);

配置参数

配置项 配置实例
创建编辑器
AliyunEditorFactory.creatAliyunEditor(Uri uri);
初始化编辑器
AliyunIEditor.init(SurfaceView surfaceView);//设置预览窗口

开始编辑

配置项 配置实例
获取视频源管理器
AliyunIEditor.getSourcePartManager();//获取视频源管理器
在最后添加视频/照片
AliyunIClipConstructor.addMediaClip(AliyunClip clip);
在指定位置的添加视频/照片
AliyunIClipConstructor.addMediaClip(int index, AliyunClip clip);
更新替换指定位置的视频源
AliyunIClipConstructor.updateMediaClip(int index, AliyunClip clip);
删除最后一个视频源
AliyunIClipConstructor.deleteMediaClip();
删除某一个指定的视频源
AliyunIClipConstructor.deleteMediaClip(int index);
应用更新的视频源列表(旧的将清空)
AliyunIClipConstructor.updateAllClips(List<AliyunClip> clips);
获取当前视频源个数
AliyunIClipConstructor.getMediaPartCount();
获取当前视频源列表
AliyunIClipConstructor.getAllClips();
交换视频源顺序
AliyunIClipConstructor.swap(int pos1, int pos2);
应用更新的视频源
AliyunIEditor.applySourceChange();//应用更新的视频源

设置特效

  • 滤镜

    该模块接口用来编辑滤镜效果。

    配置项 配置实例
    添加滤镜效果
    AliyunIEditor.applyFilter(EffectBean effect);
    移除滤镜效果
    AliyunIEditor.applyFilter(new EffectBean());//设置路径为null即表示移除滤镜
  • 动效滤镜
    该模块接口用来编辑动效滤镜(灵魂出窍等)效果。
    配置项 配置实例
    添加特效滤镜
    AliyunIEditor.addAnimationFilter(EffectFilter filter);
    移除特效滤镜
    AliyunIEditor.removeAnimationFilter(EffectFilter filter);
    清除所有的特效滤镜
    AliyunIEditor.clearAllAnimationFilter();
  • 动图、气泡、文字

    该模块接口用来编辑动图效果。

    使用UI控制器

    UI控制器添加动图,指阿里云SDK针对短视频常见的动图交互逻辑(缩放、旋转、镜像)封装的一套动图控制框架。涉及的核心接口类包括:AliyunIEditor、AliyunPasterManager、AliyunPasterController和AliyunPasterBaseView,在动图控制框架下进行贴图交互遵循Demo展示的交互规则。

    • AliyunIEditor:编辑器核心类。
    • AliyunPasterManager:UI控制框架中的贴图或字幕管理器,负责添加贴图。
    • AliyunPasterController:UI控制框架中针对单个贴图的控制器,负责设置贴图显隐、移除贴图。还可以获取贴图的相关属性信息,比如显示时长等。
    • AliyunPasterBaseView:UI控制框架中对贴图展示View的接口抽象。在不改动交互的情况下,如果开发者需要自定义贴图展示UI,则只需要实现该接口。
    配置项 配置实例
    获取动图管理器(AliyunPasterManager)
    AliyunIEditor.createPasterManager();
    设置动图显示区域的大小(==必须在AliyunIEditor.init之前调用该接口==)
    AliyunPasterManager.setDisplaySize(int width, int height);
    添加普通动图/气泡动图(返回UI controller——AliyunPasterController)
    AliyunPasterManager.addPaster(String path);//全局
    AliyunPasterManager.addPasterWithStartTime(String path, long startTime, long duration);//指定时间段内
    添加文字
    AliyunPasterManager.addSubtitle(String text, String font);//全局
    AliyunPasterManager.addSubtitleWithStartTime(String text, String font, long startTime, long duration);//指定时间段
    设置动图/气泡/文字的UI实现View(AliyunPasterBaseView)该接口必须调用
    AliyunPasterController.setPasterView(AliyunPasterBaseView pasterView);
    设置动图恢复的回调
    AliyunPasterManager.setOnPasterRestoreListener(OnPasterRestored listener);
    移除动图(将动图从UI框架中移除掉)
    AliyunPasterController.removePaster();
    显示动图(将动图渲染到视频上,并且从UI层面消失)
    AliyunPasterController.editCompleted();
    隐藏动图(将动图从视频渲染上移除掉,并且显示在UI层面)
    AliyunPasterController.editStart();
    创建一个贴图View层的预览播放器
    AliyunPasterController.createPasterPlayer(TextureView view);
    移除动图
    AliyunPasterController.removePaster();
    不使用UI控制器

    不使用UI控制器,需要开发者自主实现上层对动图的编辑交互,使用复杂度较高,不推荐。渲染动图只需要将动图素材的对象、对应位置、大小等信息传递给渲染器。

    不使用UI控制器添加动图,指使用阿里云SDK提供的一套贴图渲染接口实现贴图功能。实际上,UI控制器框架内部也是使用这套接口来完成的。涉及的核心接口类包括:AliyunIEditor、AliyunPasterManager和AliyunPasterRender。

    • AliyunIEditor:编辑器核心类。
    • AliyunPasterManager:UI控制框架中的贴图或字幕管理器,负责添加贴图。
    • AliyunPasterRender:贴图渲染核心类。该接口只用来完成贴图渲染到视频,而上层的UI交互逻辑需要开发者完成,且开发者要计算好对应位置、大小、旋转角度等信息。
    配置项 配置实例
    获取动图管理器(AliyunPasterManager)
    AliyunIEditor.createPasterManager();
    获取贴图渲染器(AliyunPasterRender)
    AliyunIEditor.getPasterRender();
    设置动图显示区域的大小(必须在AliyunIEditor初始化之前调用该接口)
    AliyunPasterRender.setDisplaySize(int width, int height);
    AliyunPasterManager.setDisplaySize(int width, int height);
    添加动图
    AliyunPasterRender.addEffectPaster(EffectPaster paster);
    显示动图
    AliyunPasterRender.showPaster(EffectPaster paster);
    隐藏动图
    AliyunPasterRender.hidePaster(EffectPaster paster);
    移除动图
    AliyunPasterRender.removePaster(EffectPaster paster);
    设置贴图保存和恢复的回调
    AliyunPasterRender.setOnPasterResumeAndSave(OnPasterResumeAndSave listener);
  • 静态贴纸
    配置项 配置实例
    添加静态贴纸
    AliyunIEditor.addImage(EffectPicture picture);
    移除静态贴纸
    AliyunIEditor.removeImage(EffectPicture picture);
  • 水印
    配置项 配置实例
    水印
    AliyunIEditor.applyWaterMark(String imgPath, float sizeX, float sizeY, float posX, float posY);
    片尾水印
    AliyunIEditor.addTailWaterMark(String imagePath, float sizeX, float sizeY, float posX, float posY, long durationUs);
  • 转场
    配置项 配置实例
    添加转场配置导入添加视频或照片时可以配置转场信息
    AliyunVideoClip.setTransition(TransitionBase transition); //视频加转场
    AliyunImageClip.setTransition(TransitionBase transition); //图片加转场
    更新转场配置更新视频源时可以修改转场信息,并且更新转场信息
    AliyunEditor.setTransition(int index, TransitionBase transition); //设置一个转场,index为转场位置,从0开始记
    AliyunEditor.setTransition(Map<Integer, TransitionBase> transitions); //设置多个转场
  • 帧动画
    配置项 配置实例
    添加帧动画
    AliyunEditor.addFrameAnimation(ActionBase action);
    移除帧动画
    removeFrameAnimation(ActionBase action);
  • MV
    配置项 配置实例
    添加MV
    AliyunIEditor.applyMV(EffectBean effect);
    移除MV
    AliyunIEditor.applyMV(null);//设置为null表示移除
  • 背景音乐、多段配音
    配置项 配置实例
    添加背景音乐、配音,音乐不受时间特效影响,配音受时间特效影响
    AliyunIEditor.applyMusic(EffectBean effect);//音乐
    AliyunIEditor.applyDub(EffectBean effect);//配音
    移除背景音乐、配音
    AliyunIEditor.removeMusic(EffectBean effect);//音乐
    AliyunIEditor.removeDub(EffectBean effect);//配音
    调整背景音乐、配音与原音的比重
    AliyunIEditor.applyMusicMixWeight(int id, int weight);
    单独调整指定音频流的音量(背景音乐、配音、原音)
    AliyunIEditor.applyMusicWeight(int id, int weight);
    去噪(比较消耗资源,慎用)
    AliyunIEditor.denoise(int id, boolean needDenoise);
  • 音效

    短视频SDK支持对每路音频流设置音效,目前提供的音效有萝莉、大叔、混响、回声等。

    配置项 配置实例
    设置单路流音效

    音效支持叠加操作,想要切换音效需要先删除上次设置的音效。

    • id:指定的音频流id。
    • type:特效类型。
    • weight:特效效果参数,0-100。
    int audioEffect(int id, AudioEffectType type, int weight);
    删除某个音效
    音效支持叠加操作,想要切换音效需要先删除上次设置的音效。
    int removeAudioEffect(int id, AudioEffectType type);
  • 时间特效
    配置项 配置实例
    变速
    AliyunIEditor.rate(float rate, long startTime, long duration, boolean needOriginDuration);
    //3.7.0版本开始变速接口可以针对多段视频/图片添加
    反复
    AliyunIEditor.repeat(int times, long startTime, long duration, boolean needOriginDuration);
    倒放
    AliyunIEditor.invert();
    特别注意:对于GOP大于5的视频需要先转码,否则将无法倒播。对于视频GOP的检查可以用NativeParser.getMaxGopSize()来获取。转码时将GOP SIZE设置为1,即CropParam.setGop(1);
    删除变速特效
    AliyunIEditor.deleteTimeEffect(int id);
  • 涂鸦

    短视频SDK封装了一套涂鸦接口,包含画板、画笔等,整个涂鸦操作由涂鸦控制器(AliyunICanvasController)完成。

    画板:涂鸦对应的UI交互View,可以添加到UI交互的ViewGroup。

    画笔:一个android.graphics.Paint对象,开发者可以从外部设置,也可以使用默认画笔。

    配置项 配置实例
    获取涂鸦控制器(AliyunICanvasController)
    AliyunIEditor.obtainCanvasController(Context context, int w, int h);
    获取涂鸦画板View
    AliyunICanvasController.getCanvas();
    判断是否由涂鸦
    AliyunICanvasController.hasCanvasPath();
    设置涂鸦渲染到视频上
    AliyunICanvasController.applyPaintCanvas();
    移除渲染到视频上的涂鸦
    AliyunICanvasController.removeCanvas();
    撤销上一笔
    AliyunICanvasController.undo();
    清除画布
    AliyunICanvasController.clear();
    设置当前画笔颜色
    AliyunICanvasController.setCurrentColor(int color);
    设置当前画笔的粗细
    AliyunICanvasController.setCurrentSize(float size);
    设置自定义画笔
    AliyunICanvasController.setPaint(Paint paint);
    重制涂鸦画板
    AliyunICanvasController.resetPaintCanvas();
    撤销该次所有涂鸦操作
    AliyunICanvasController.cancel();
    确认该次所有涂鸦操作
    AliyunICanvasController.confirm();
    释放资源
    AliyunICanvasController.release();
  • 其他
    配置项 配置实例
    设置动态显示模式
    AliyunIEditor.addRunningDisplayMode(VideoDisplayMode mode, int streamId, long startTimeMills, long durationMills);
    设置模糊背景(填充模式下效果可见)
    AliyunIEditor.applyBlurBackground(int streamId, long startTimeMills, long durationMills, float blurRadius);

预览控制

配置项 配置实例
更换显示窗口
AliyunIEditor.setDisplayView(SurfaceView surfaceView);
AliyunIEditor.setDisplayView(TextureView textureView);//没有特殊需求不推荐使用该接口
开始播放
AliyunIEditor.play();
Seek
AliyunIEditor.seek();
强制绘制一帧
AliyunIEditor.draw();
暂停播放
AliyunIEditor.pause();
继续播放
AliyunIEditor.resume();
停止播放
AliyunIEditor.stop();
获取当前流的位置(不受时间特效影响)
AliyunIEditor.getCurrentStreamPosition();
获取当前播放的位置(受时间特效影响,即当前的播放时间)
AliyunIEditor.getCurrentPlayPosition();
获取流时长(不受时间特效影响)
AliyunIEditor.getStreamDuration();
获取播放总时长(受时间特效影响)
AliyunIEditor.getDuration();
设置静音播放
AliyunIEditor.setAudioSilence(boolean silence);
设置音量
AliyunIEditor.setVolume(int volume);
设置视频显示模式
AliyunIEditor.setDisplayMode(VideoDisplayMode mode);
填充模式下设置填充背景色
AliyunIEditor.setFillBackgroundColor(int color);

合成输出

配置项 配置实例
合成
AliyunIEditor.compose(AliyunVideoParam param, String outputPath, AliyunIComposeCallBack callback);
取消合成
AliyunIEditor.cancelCompose();

示例代码

//第一步,导入编辑,获取URI地址
//first,import project
AliyunIImport mImport = AliyunImportCreator.getImportInstance(mContext);
mAliyunVideoParam = new AlivcEditInputParam.Builder().build().generateVideoParam();
mImport.setVideoParam(mAliyunVideoParam);
AliyunClip videoClip = new AliyunVideoClip.Builder()
    .source(mYourVideoPath).id(mYourVideoId).displayMode(AliyunDisplayMode.DEFAULT)
    .build();
mImport.addMediaClip(videoClip);
Uri mUri = Uri.parse(mImport.generateProjectConfigure());
mImport.release();

//第二步,创建编辑器
mAliyunIEditor = AliyunEditorFactory.creatAliyunEditor(mUri, mYourEditorCallback);
int ret = mAliyunIEditor.init(mSurfaceView, mContext); //return 0 to success

//第三步,创建特效,参考上边API文档

//第四步,控制预览
mAliyunIEditor.play(); //播放

//第五步,合成输出
mAliyunIEditor.compose(mAliyunVideoParam, mYourOutputPath, mYourComposeCallback);