功能介绍

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

版本差异

版本 功能描述
专业版 支持所有功能。
标准版 支持基础功能,高级功能需要License授权。
基础版 不支持。

导入编辑

视频导入编辑的流程如下:导入编辑
说明
  • startEdit和stopEdit两者成对出现,调用startEdit方法后SDK内部会创建相关资源,调用stopEdit方法后SDK内部会销毁相关资源,页面销毁前必须调用stopEdit,否则会导致内存泄露。
  • 媒体片段需要在开始编辑前确定,因此媒体片段管理接口AliyunIClipConstructor的调用在startEdit之前。
  • 播放控制,编辑功能和合成导出的接口调用在startEdit和stopEdit之间。

初始化配置

生成TaskPath

TaskPath是一个文件夹路径,文件夹中存放有包含视频素材路径、输出码率、GOP、分辨率等信息的配置文件以及临时文件。AliyunEdit通过TaskPath中的配置文件读取参数信息。生成TaskPath的方式有两种方法:
  • 录制到编辑的场景下,初始化录制模块AliyunIRecorder,为TaskPath属性设置空的文件夹路径,调用录制相关接口将自动创建配置文件并添加视频素材资源。
  • 导入到编辑的场景下,初始化AliyunImporter,为TaskPath参数设置空的文件夹路径,调用AliyunIClipConstructor协议方法添加视频素材资源,最后调用- (void)generateProjectConfigure方法创建配置文件。
AliyunImporter负责生成编辑配置文件,主要接口如下:
配置项 配置实例
初始化
/**
 初始化AliyunImporter @param TaskPath TaskPath文件夹地址,保证文件夹已存在 
@param outputSize 导出视频分辨率设置,必须为偶数 
@return AliyunImporter
 */
- (instancetype)initWithPath:(NSString *)TaskPath outputSize:(CGSize)outputSize;
视频输出参数
/**
 设置视频输出参数
 @param videoParam 视频输出参数 
*/
- (void)setVideoParam:(AliyunVideoParam *)videoParam;
生成配置文件
/**
/**
 在TaskPath目录下,生成配置文件
 */
- (void)generateProjectConfigure;
添加媒体片段接口

AliyunImporter实现了AliyunIClipConstructor协议,用于配置媒体片段。

其中参数AliyunClip代表一个视频或图片对象,我们可以通过初始化方法创建一个AliyunClip对象

- (void)addMediaClip:(AliyunClip *)clip;
创建视频片段
/**
 创建一个视频片段
 @param path 视频路径
 @param animDuration 过渡动画时长
 @return 视频片段
 */
- (instancetype)initWithVideoPath:(NSString *)path
                     animDuration:(CGFloat)animDuration;
创建图片片段
/**
 创建一个图片片段
 @param path 图片路径
 @param duration 图片时长
 @param animDuration 过渡动画时长
 @return 图片片段
 */
- (instancetype)initWithImagePath:(NSString *)path
                         duration:(CGFloat)duration
                     animDuration:(CGFloat)animDuration;
创建GIF片段
 创建一个gif片段
@param path gif路径 
@return gif片段
 */
- (instancetype)initWithGifPath:(NSString *)path;

初始化Editor

通过初始化方法创建AliyunEdit对象:
 /**
 @param TaskPath 文件夹路径
 @param preview 编辑预览视图
 @return Editor
 */
 - (instancetype)initWithPath:(NSString *)TaskPath preview:(UIView *)preview;
说明 TaskPath必须是已经生成好配置文件的文件夹路径preview表示预览UIView,预览UIView的长宽比和导出视频分辨率的长宽比需保持一致。如果只用来导出视频无需播放预览,直接传入nil即可。

媒体片段管理

编辑模块可以通过-(id<AliyunIClipConstructor>)getClipConstructor方法获取媒体片段管理器,实现媒体片段管理。AliyunIClipConstructor实现了添加与删除媒体片段的操作,具体接口如下:
配置项 配置实例
增加媒体片段
/**
@param clip 媒体片段
*/
- (void)addMediaClip:(AliyunClip *)clip;
设置所有媒体片段
/**
@param clips 媒体片段列表
*/
- (void)setMediaClips:(NSArray<AliyunClip *> *)clips;
增加媒体片段至指定位置
/**
@param clip 媒体片段
@param index index
*/
- (void)addMediaClip:(AliyunClip *)clip atIndex:(NSInteger)index;
更新媒体片段
/**
@param clip 媒体片段
@param index index
*/
- (void)updateMediaClip:(AliyunClip *)clip atIndex:(NSInteger)index;
删除媒体片段
/**
@param index index
*/
- (void)deleteMediaClipAtIndex:(NSInteger)index;
删除所有媒体片段
- (void)deleteAllMediaClips;
获取媒体片段
/**
@param index index
@return 媒体片段
*/
- (AliyunClip *)mediaClipAtIndex:(NSInteger)index;
获取所有媒体片段
/**
@return 媒体片段列表
*/
- (NSArray<AliyunClip *> *)mediaClips;
说明 注意修改媒体片段操作需要在调用startEdit方法前,或调用stopEdit方法后执行。

播放控制

播放控制接口
配置项 配置实例
通过接口获取播放器
 - (id<AliyunIPlayer>)getPlayer;
开始播放
- (int)play;
seek到某一时间点
/**
@param time 时间,单位:秒
*/
-(int)seek:(float)time;
绘制一帧
/**
@param time 时间,单位:秒
*/
-(int)draw:(float)time;
暂停播放
- (int)pause;
继续播放
- (int)resume;
是否正在播放
/**
@return 正在播放
*/
- (BOOL)isPlaying;
重新开始播放
- (int)replay;
停止播放
/**
* 正常返回 ALIVC_COMMON_RETURN_SUCCESS
* 状态不正确 ALIVC_COMMON_INVALID_STATE
*/
- (int)stop;
获取总时长(秒)
/**
@return 总时长
*/
- (double)getDuration;
获取当前播放时间(秒)
- (double)getCurrentTime;
获取原始视频流时长(秒)
/**
@return 总时长
*/
- (double)getStreamDuration;
获取原始视频流播放时间(秒)
- (double)getCurrentStreamTime;
获取视频片段在播放时间轴上开始播放的时间(秒)
/**
@param idx 视频片段序列号
@return 时间,单位:秒
*/
- (double)getClipStartTimeAtIndex:(int)idx;
设置播放器的刷新频率

默认值:30帧/s,最大值:60帧/s,建议设置值不小于20帧/s。

/**
@param fps 帧
*/
- (void)setRefreshFps:(double)fps;

播放回调监听

实现播放状态监听,需要实现delegate代理的AliyunIPlayerCallback协议,回调方法定义如下:
配置项 配置实例
开始播放
- (void)playerDidStart;
结束播放

播放结束重新播放,需要调用replay方法。

- (void)playerDidEnd;
seek结束
- (void)seekDidEnd;
播放进度
/**
@param playSec 播放时间
@param streamSec 播放流时间
*/
- (void)playProgress:(double)playSec streamProgress:(double)streamSec;
播放异常
/**
@param errorCode 错误码
*/
- (void)playError:(int)errorCode;
说明
  • 播放器接口调用对应关系:play和stop对应,pause和resume对应。
  • 调用seek方法或添加编辑效果(MV、音乐等),播放器将进入pause状态,此时需要调用resume方法后才能继续播放。
  • 时间特效影响播放时间轴,播放器Duration和StreamDuration,CurrentTime和CurrentStreamTime的区别举例如下:
    • 总时长15s的视频,全程快速2倍播放。此时,getDuration为7.5s,假设getCurrentTime为3.5s,那么getStreamDuration为15s,getCurrentStreamTime为7s。
    • 总时长15s的视频,全程慢速2倍播放。此时,getDuration为30s,假设getCurrentTime为10s,那么 getStreamDuration为15s,getCurrentStreamTime为7.5s。
    • 总时长15s的视频,全程倒播。此时,getDuration为15s,假设getCurrentTime为6s,那么getStreamDuration为15s,getCurrentStreamTime为9s。

设置特效

  • 滤镜
    短视频SDK的滤镜资源存放在滤镜文件夹,滤镜文件夹包含配置文件和相关资源。AliyunEffectFilter代表一个滤镜资源,可以通过初始化方法构造一个滤镜实例,参数path是滤镜资源文件夹路径。
    配置项 配置实例
    生成滤镜对象
    - (id)initWithFile:(NSString *)path;
    添加一个滤镜

    由于滤镜无法叠加,因此每次调用applyFilter:方法都会替换滤镜。

    - (int)applyFilter:(AliyunEffectFilter *)filter;
    删除滤镜
    - (int)removeFilter;
  • 时间特效
    时间特效指的是对视频添加反复,变速,倒放等效果。AliyunEffectTimeFilter代表一个时间特效,调用示例如下:
    AliyunEffectTimeFilter *timeFilter = [[AliyunEffectTimeFilter alloc] init];
      // 时间特效开始时间
      timeFilter.startTime = 1;
      // 时间特效结束时间
      timeFilter.endTime = 2;
      // 变速特效
      timeFilter.type = TimeFilterTypeSpeed;
      // 0.5倍播放
      timeFilter.param = 0.5;
      // 应用时间特效
      [self.editor applyTimeFilter:timeFilter];
      // 使用时间特效后,处于暂停状态,调用resume继续播放
      [self.player resume];

    时间特效类型支持TimeFilterTypeSpeed变速,TimeFilterTypeRepeat反复,TimeFilterTypeInvert倒播三种。当设置为变速时,需要param属性指定播放速度。当设置为反复时,需要param属性指定反复次数。

    说明 倒播,反复特效只支持单段视频,且不支持与其他时间特效叠加。使用倒播特效前建议先对视频转码,否则可能出现卡段。
  • MV
    短视频SDK的MV资源存放在MV文件夹中,MV文件夹包含了配置文件和相关资源。下载的MV压缩包中有四种长宽比的MV文件夹,用来适配不同的输出分辨率。AliyunEffectMV代表一个MV资源,可以通过初始化方法构造一个MV实例,参数path是MV资源文件夹路径。
    配置项 配置实例
    生成MV对象
    - (id)initWithFile:(NSString *)path;
    添加一个MV

    由于滤镜无法叠加,因此每次调用applyMV:方法都会替换MV。

    - (int)applyMV:(AliyunEffectMV *)mv;
    删除MV
    - (int)removeMV;
    删除MV音乐
    -(int)removeMVMusic;
  • 音乐
    AliyunEffectMusic代表一个音乐资源,可以通过初始化方法构造一个音乐实例,参数path是音乐资源文件路径。
    配置项 配置实例
    生成音乐对象
    - (id)initWithFile:(NSString *)path;
    添加音乐
    - (int)applyMusic:(AliyunEffectMusic *)music;
    删除某个音乐

    SDK支持多路音乐叠加,删除某个音乐接口如下:

    - (int)removeMusic:(AliyunEffectMusic *)music;
    删除所有音乐
    - (int)removeMusics;
    音乐支持选取时间段播放,同时支持添加到视频特定时间段播放。属性设置接口如下:
    @property (nonatomic, assign) CGFloat startTime;        // 选取音乐开始时间点
    @property (nonatomic, assign) CGFloat duration;         // 选取音乐持续时长
    @property (nonatomic, assign) CGFloat streamStartTime;  // 音乐添加到播放时间轴的开始时间点
    @property (nonatomic, assign) CGFloat streamDuration;   // 音乐添加到播放时间轴的持续时长
    例:选择一段音乐的第5-10秒,从视频的8秒开始播放并循环2次,设置如下:
    AliyunEffectMusic *music = [[AliyunEffectMusic alloc] initWithFile:`音乐文件路径`];
    music.startTime = 5;
    music.duration = 5;
    music.streamStartTime = 8;
    music.streamDuration = 10;
    说明 调用音乐相关接口后,播放器将处于pause状态,此时需要调用resume方法后才能继续播放。
  • 配音
    AliyunEffectDub表示配音资源,继承AliyunEffectMusic,配音用法和音乐基本一致。相关接口如:
    配置项 配置实例
    添加配音
    - (int)applyDub:(AliyunEffectDub *)dub;
    删除配音
    - (int)removeDub:(AliyunEffectDub *)dub;
    移除所有配音
    - (int)removeDubs;
    说明 配音和音乐的区别:配音支持变速功能,音乐不支持。比如,视频全程快速2倍播放,那么配音也会以2倍速播放,但是音乐却以正常速度播放。
  • 音效

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

    AliyunAudioEffectType音效类型。weight音效权重,范围0-100。streamId流id,音乐的streamId存放在AliyunEffectMusic的effectVid属性中,MV存放在AliyunEffectMV的audioEffectVid属性中,主流存放在AliyunClip的streamId属性中。
    配置项 配置实例
    设置单路流音效
      - (int)setAudioEffect:(AliyunAudioEffectType)type weight:(int)weight streamId:(int)streamId;
    删除单路流音效

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

    - (int)removeAudioEffect:(AliyunAudioEffectType)type streamId:(int)streamId;
    设置主流音效

    除了设置单路流音效,SDK还提供了便捷方法设置主流音效。

    - (int)setMainStreamsAudioEffect:(AliyunAudioEffectType)type weight:(int)weight;
    去除主流音效
    - (int)removeMainStreamsAudioEffect:(AliyunAudioEffectType)type;
  • 其他音频设置
    配置项 配置实例
    设置静音
    - (int)setMute:(BOOL)mute;
    设置音量

    默认值:100,如果设置的volume值大于100可能导致破音,建议设置范围:0-100。

    - (int)setVolume:(int)volume;
    设置主流音频大小

    主流指导入编辑添加的一段或多段视频。

    - (int)setMainStreamsAudioWeight:(int)weight;
    设置任意流音频大小

    无论视频、音乐、配乐或MV,添加后都会分配唯一的streamId。音乐的streamId存放在AliyunEffectMusic的effectVid属性中,MV存放在AliyunEffectMV的audioEffectVid属性中,主流存放在AliyunClip的streamId属性中。

    - (int)setAudioWeight:(int)weight streamId:(int)streamId;
    设置主流去噪
    - (int)setMainStreamsAudioDenoise:(BOOL)denoise;
    设置任意音频流去噪
    - (int)setAudioDenoise:(BOOL)denoise streamId:(int)streamId;
  • 动图贴纸

    SDK提供普通贴纸、纯字幕和气泡字幕三种类型贴图。提供添加贴图两种方式,一种是采用pasterManager接口,另一种是采用pasterRender底层接口。

    • pasterManager方式
      相关类功能如下表:
      功能
      AliyunPasterManager 负责创建AliyunPasterController对象
      AliyunPasterBaseView 获取上层UI的状态
      AliyunPasterBaseView 将用户交互对UI的修改反馈到控制层,控制层再同步UI状态到渲染层,从而完成贴纸的渲染
      通过AliyunPasterManager可以添加贴纸,MVC设计示意图如下:MVC设计示意图

      上面的示意图中我们看到AliyunPasterManager负责创建AliyunPasterController对象,控制器中定义了AliyunPasterBaseView接口来获取上层UI的状态,用户交互对UI的修改会通过AliyunPasterBaseView反馈到控制层,控制层再同步UI状态到渲染层,从而完成了贴纸的编辑渲染,这样UI层可以自由定制,只要实现AliyunPasterViewUIEventProtocol即可。

      AliyunPasterViewUIEventProtocol协议主要有:
        - (void)eventBoundsDidChanged:(CGRect)aBounds;//大小同步给控制器,用来渲染
        - (void)eventCenterDidChanged:(CGPoint)aCenter;//中心点同步给控制器,用来渲染
        - (void)eventRotateDidChanged:(CGFloat)aRotate;//旋转角度同步给控制器,用来渲染
        - (void)eventTextBoundsDidChanged:(CGRect)aBounds;//文字大小同步给控制器,用来渲染
        - (void)eventTextCenterDidChanged:(CGPoint)aCenter;//文字位置同步给控制器,用来渲染
        - (void)eventMirrorChanged:(BOOL)isMirror;//是否镜像
        - (void)eventPasterViewClosed:(UIView *)pasterView;//动图UI关闭
        - (void)eventEditDidEnd;//编辑完成
      pasterManager管理整个动图,为了确保最终渲染的贴图位置和大小正确,需要优先设置编辑区域和渲染区域。相关接口如下:
      配置项 配置实例
      设置编辑区域
      /**
      通常,编辑区域需要铺满整个视频区域,所有的上层动图加在该区域内。
      */
      @property (nonatomic, assign) CGSize displaySize;
      设置视频输出分辨率
      /**
      合成时需要根据输出分辨率计算贴图的渲染区域大小。
      */
      @property (nonatomic, assign) CGSize outputSize;
      设置渲染区域

      渲染区域指将相对物理像素区域的逻辑像素区域进行转化。

      /**
      该渲染区域是将逻辑像素区域对物理像素区域进行过转化,通过 [_editor getPreviewRenderSize]获取
      */
      @property (nonatomic, assign) CGSize previewRenderSize;
      添加动图
      /**
      @param filePath 动图资源路径
      @param st 动图开始时间
      @param duration 动图持续时间
      @return 返回动图控制器
      */
      - (AliyunPasterController *)addPaster:(NSString *)filePath startTime:(double)st duration:(double)duration;
      添加字幕
      /**
      @param text 文字 如果为空 则会第一次会进入编辑  如果不为空 则直接显示 不会进入编辑状态
      @param bounds 大小
      @param st 字幕开始时间
      @param duration 字幕持续时间
      @return 返回动图控制器
      */
      - (AliyunPasterController *)addSubtitle:(NSString *)text bounds:(CGRect)bounds startTime:(CGFloat)st duration:(CGFloat)duration;
      获取全部动图控制器
      /**
      @return 动图控制器数组
      */
      - (NSArray *)getAllPasterControllers;
      通过id获取pasterController
      /**
      @param obj id
      @return pasterController
      */
      - (AliyunPasterController *)getPasterControllerByObj:(id)obj;
      动图上某个位置是否存在动图
      /**
      @param point 点击的位置
      @param time 当前视频播放的当前时间
      @return 若当前时刻该位置有动图,则返回动图控制器,否则,返回nil
      */
      - (AliyunPasterController *)touchPoint:(CGPoint)point atTime:(double)time;
      删除全部动图
      - (void)removeAllPasterControllers;
      移除pasterController
      /**
      API_AVAILABLE(3.7.0)
      @param pasterController 动图控制器对象
      */
      - (void)removePasterController:(AliyunPasterController *)pasterController;
      删除全部普通动图
      - (void)removeAllNormalPasterControllers;
      删除全部字幕动图
      - (void)removeAllCaptionPasterControllers;
      删除全部纯文字动图
      - (void)removeAllSubtitlePasterControllers;
      获取编辑中的动图控制器
      /**
      @return 动图控制器
      */
      - (AliyunPasterController *)getCurrentEditPasterController;

      addPaster和addSubtitle 表示创建贴图的接口,返回的AliyunPasterController表示贴图控制器,内部渲染贴图用到的参数是从AliyunPasterController里面读取的,AliyunPasterController定义了贴图的位置,大小,显示起止时间等相关信息。

      pasterController相关接口如下:
      配置项 配置实例
      设置动图view
      /**
      @warning:一定要设置
      */
      @property (nonatomic, strong) UIView *pasterView;
      设置动图类型
      @property (nonatomic, assign, readonly) AliyunPasterEffectType pasterType;
      设置动图旋转角度(弧度)

      所有涉及到位置和大小的具体数值指考逻辑像素,内部在渲染时会统一转化为物理像素值进行计算。

      @property (nonatomic, assign) CGFloat pasterRotate;
      设置动图位置(x,y)
      @property (nonatomic, assign) CGPoint pasterPosition;
      设置动图宽高
      @property (nonatomic, assign) CGSize pasterSize;
      设置动图位置大小
      @property (nonatomic, assign) CGRect pasterFrame;
      设置动图镜像
      @property (nonatomic, assign) BOOL mirror;
      设置文字内容
      @property (nonatomic, copy) NSString *subtitle;
      设置文字位置

      文字位置指相对于动图本身位置。

      @property (nonatomic, assign) CGRect subtitleFrame;
      设置文字的后台配置字体
      @property (nonatomic, copy, readonly) NSString *subtitleConfigFontName;
      设置文字的后台配置字体的id
      @property (nonatomic, assign, readonly) NSInteger subtitleConfigFontId;
      设置文字是否描边
      @property (nonatomic, assign) BOOL subtitleStroke;
      设置文字颜色
      @property (nonatomic, strong) UIColor *subtitleColor;
      设置文字描边颜色
      @property (nonatomic, strong) UIColor *subtitleStrokeColor;
      设置文字的背景颜色
      @property (nonatomic, strong) UIColor *subtitleBackgroundColor;
      设置文字字体
      @property (nonatomic, copy) NSString *subtitleFontName;
      设置关键帧图片
      @property (nonatomic, strong, readonly) UIImage *kernelImage;
      设置动图开始时间(秒)
      @property (nonatomic, assign) CGFloat pasterStartTime;
      设置动图结束时间(秒)
      @property (nonatomic, assign) CGFloat pasterEndTime;
      设置动图持续时间(秒)
      @property (nonatomic, assign) CGFloat pasterDuration;
      设置动图最小持续时间(秒)
      @property (nonatomic, assign) CGFloat pasterMinDuration;
      设置编辑区域
      @property (nonatomic, assign) CGSize displaySize;
      设置视频输出分辨率
      @property (nonatomic, assign) CGSize outputSize;
      设置预览大小
      @property (nonatomic, assign) CGSize previewRenderSize;
      说明 表示动图位置和大小的具体值为逻辑像素值,内部渲染时将统一转化为物理像素值进行计算。
      PasterController具有编辑状态的属性,用户开始或结束编辑需要手动调用相关方法通知PasterController切换状态,具体方法如下:
      配置项 配置实例
      准备进入编辑状态
      /**
      进入编辑状态前,内部将移除当前渲染的动图。
      */
      - (void)editWillStart;
      进入编辑状态
      - (void)editDidStart;
      开始编辑
      - (void)editProcess;
      完成编辑
      /**
      完成编辑后,内部将同步pasterController属性信息并渲染。
      */
      - (void)editCompleted;
      完成字幕编辑
      /**
      此接口上面的接口功能一致,SDK后续版本将丢弃此接口。
      @param image 字幕的图片
      */
      - (void)editCompletedWithImage:(UIImage *)image;
      通过AliyunPasterControllerDelegate可以监听动图的状态,相关接口如下:
      配置项 配置实例
      移除动图控制器
      /**
      @param obj 动图控制器
      */
       - (void)onRemove:(id)obj;
      准备进入编辑
      /**
      @param obj 动图控制器
      */
      - (void)onEditWillBegin:(id)obj;
      开始编辑
      /**
      @param obj 动图控制器
      */
      - (void)onEditDidBegin:(id)obj;
      完成编辑
      /**
      @param obj 动图控制器
      */
      - (void)onEditEnd:(id)obj;
      完成图片渲染
      /**
      @param obj 动图控制器
      @param image 需要渲染的图片
      */
      - (void)onEditEnd:(id)obj image:(UIImage *)image;
      示例:
          AliyunPasterController *pasterController = [self.pasterManager addPaster:pasterInfo.resourcePath startTime:range.startTime duration:range.duration]; //初始化pasterController
          AliyunPasterView *pasterView = [[AliyunPasterView alloc] initWithPasterController:pasterController]; //通过pasterController生成pasterView
          pasterController.subtitleFontName = pasterView.textFontName;//设置文字字体
          pasterController.subtitleStroke = pasterView.textColor.isStroke;//设置文字是否描边
          pasterController.subtitleColor = [pasterView contentColor];//设置文字颜色
          pasterController.subtitleStrokeColor = [pasterView strokeColor];//设置文字描边颜色
          pasterController.subtitleBackgroundColor = [pasterView textBackgroundColor];//设置文字背景颜色
      
          pasterView.delegate = (id)pasterController;
          pasterView.actionTarget = (id)self;
      
          [pasterController setPasterView:pasterView];
          [pasterController editCompleted];//编辑完成,进行渲染
    • pasterRender方式
      pasterManager添加动图的方式包含了SDK中默认UI,如果您需要完全自定义UI,可以直接调用pasterRender来实现。相关接口如下:
      配置项 配置实例
      获取AliyunPasterRender实例
      - (AliyunPasterRender *)getPasterRender;
      添加动图
      @param paster 动图对象
      * 正常返回 ALIVC_COMMON_RETURN_SUCCESS
      * 状态不正确 ALIVC_COMMON_INVALID_STATE
      * 文件不存在 ALIVC_SVIDEO_EDITOR_FILE_NOT_EXIST
      * 解析动图失败 ALIVC_SVIDEO_EDITOR_PARSE_RESOURCE_FAILED
      * ALIVC_FRAMEWORK_RENDER_ERROR_SCENE_INVALID
      */
      - (int)addGifPaster:(AliyunEffectPaster *)paster;
      添加纯文字
      @param subtitle 纯文字动图对象
      @param textImage 文字截图
      * 正常返回 ALIVC_COMMON_RETURN_SUCCESS
      * 状态不正确 ALIVC_COMMON_INVALID_STATE
      * ALIVC_FRAMEWORK_RENDER_ERROR_SCENE_INVALID
      */
      - (int)addSubtitlePaster:(AliyunEffectSubtitle *)subtitle textImage:(UIImage *)textImage;
      添加字幕动图
      @param caption 字幕动图对象
      @param textImage 文字截图
      * 状态不正确 ALIVC_COMMON_INVALID_STATE
      * 文件不存在 ALIVC_SVIDEO_EDITOR_FILE_NOT_EXIST
      * 解析动图失败 ALIVC_SVIDEO_EDITOR_PARSE_RESOURCE_FAILED
      * ALIVC_FRAMEWORK_RENDER_ERROR_SCENE_INVALID
      */
      - (int)addCaptionPaster:(AliyunEffectCaption *)caption textImage:(UIImage *)textImage;
      移除动图
      @param basePaster 动图对象
      * 正常返回 ALIVC_COMMON_RETURN_SUCCESS
      * 状态不正确 ALIVC_COMMON_INVALID_STATE
      * ALIVC_FRAMEWORK_RENDER_ERROR_SCENE_INVALID
      */
      - (int)removePaster:(AliyunEffectPasterBase *)basePaster;
  • 涂鸦

    涂鸦主要涉及两个类:AliyunIPaint和AliyunICanvasView。AliyunIPaint表示画笔,AliyunICanvasView表示画布。

    • AliyunIPaint相关接口如下:
      配置项 配置实例
      设置线条颜色
      @property (nonatomic, strong) UIColor *lineColor;
      设置线条宽度
      @property (nonatomic, assign) CGFloat lineWidth;
      设置线条阴影颜色
      @property (nonatomic, strong) UIColor *shadowColor;
      设置线条阴影宽度
      @property (nonatomic, assign) CGFloat shadowWidth;
      初始化线条宽度和颜色
      /**
      @param lineWidth 线条宽度
      @param lineColor 线条颜色
      @return self
      */
      - (instancetype)initWithLineWidth:(CGFloat)lineWidth
                            lineColor:(UIColor *)lineColor;
      说明 画笔目前支持设置线条颜色、宽度、线条阴影颜色和阴影宽度。
    • AliyunICanvasView相关接口如下:
      配置项 配置实例
      回调
      @property (nonatomic, weak) id<AliyunICanvasViewDelegate> delegate;
      是否允许越界画图

      默认:不允许。

      @property (nonatomic, assign) BOOL enableCrossBorder;
      设置画笔
      @property (nonatomic, strong) AliyunIPaint *paint;
      初始化画笔和画板
      /**
      @param frame 画板
      @param paint 画笔
      @return self
      */
      - (instancetype)initWithFrame:(CGRect)frame
                            paint:(AliyunIPaint *)paint;
      更改画笔配置
      /**
      @param paint 画笔
      */
      - (void)changePaint:(AliyunIPaint *)paint;
      清空所有线条(不可恢复)
      - (void)remove;
      撤销上一步
      - (void)undo;
      恢复上一步
      - (void)redo;
      撤销本次涂鸦所有的操作
      - (void)undoAllChanges;
      设置完成
      /**
      @return 涂鸦图片
      */
      - (UIImage *)complete;
      涂鸦提供的回调接口如下:
      配置项 配置实例
      开始画图
      /**
      @param startPoint 开始point
      */
      - (void)startDrawingWithCurrentPoint:(CGPoint)startPoint;
      结束画图
      /**
      @param endPoint 结束point
      */
      - (void)endDrawingWithCurrentPoint:(CGPoint)endPoint;
  • 水印
    AliyunEffectImage表示一个图片资源,您可以通过初始化方法构造一个水印图片实例,参数path为水印图片文件路径。
    配置项 配置实例
    初始化
    - (instancetype)initWithFile:(NSString *)path;

    初始化完成后,需要设置frame属性指定水印相对输出分辨率outputSize的大小位置,水印大小长宽比和原始图片长宽比保持一致。

    设置水印
    - (int)setWaterMark:(AliyunEffectImage *)waterMark;
    设置片尾水印
    - (int)setTailWaterMark:(AliyunEffectImage *)waterMark;

    您可以通过AliyunEffectMusic的endTime属性设置片尾水印的持续时长。

  • 转场

    SDK 3.7.0版本开始支持转场功能,转场的基类是:AliyunTransitionEffect。

    AliyunTransitionEffect相关接口如下:
    配置项 配置实例
    设置转场时间
    /**
    请确保转场时间大于等于视频片段时长
    */
    @property (nonatomic, assign) float overlapDuration;
    自定义转场效果
    @property (nonatomic, copy) NSString *customShader;
    设置转场自定义字段
    @property (nonatomic, strong) NSDictionary *transitionParam;
    目前SDK包含的转场种类如下:
        AliyunTransitionEffectShuffer:百叶窗转场
        AliyunTransitionEffectTranslate:平移转场 支持上下左右四个方向平移
        AliyunTransitionEffectCircle:圆形转场
        AliyunTransitionEffectPolygon:多边形转场 可以支持N变形 N > 2
        AliyunTransitionEffectFade:淡入淡出转场
    说明 如果您熟悉OpenGL Shading Language,可以使用transitionParam和customShader自定义转场的相关设置。
    示例构建AliyunImporter时,为视频clip加转场特效如下:
    AliyunClip *clip = [[AliyunClip alloc] initWithImagePath:info.sourcePath duration:info.duration animDuration:i == 0 ? 0 : 1];
    AliyunTransitionEffectFade *transitionEffect = [[AliyunTransitionEffectFade alloc] init];
    transitionEffect.overlapDuration = 2;
    clip.transitionEffect = transitionEffect;
    
    //clip中带有transitionEffect属性,可以通过此属性进行设置

    转场配置不仅能在AliyunImportor中进行,还可以在编辑模块中直接使用。

    AliyunEditor相关接口如下:
    配置项 配置实例
    添加转场
    /**
    API_AVAILABLE(3.7.0)
    注意:① 如果只有一个视频片段,不可调用此接口。
    ② 转场的时长不能超过前后两段视频中最短的视频时长。
    ③ 使用此接口前,先调用[_editor stopEdit],然后调用此接口,接着调用 [_editor startEdit] 和[_player play]。
    [----A视频段----] [----B视频段----] [----C视频段----]...[----N段视频----]
                   ^                ^                 ^
    clipIndex:      0                1                N-1
    @param transition 具体的转场
    @param clipIdx 视频片段交叉序列点
    @return 返回值为ALIVC_COMMON_RETURN_FAILED失败ALIVC_COMMON_RETURN_SUCCESS成功
    */
    - (int)applyTransition:(AliyunTransitionEffect *)transition atIndex:(int)clipIdx;
    删除某个转场效果
    /**
    API_AVAILABLE(3.7.0)注意:使用此接口前,先调用[_editor stopEdit],然后调用此接口,接着调用 [_editor startEdit] 和[_player play]。
    @param clipIdx 序列号
    */
    - (int)removeTransitionAtIndex:(int)clipIdx;
    示例
    AliyunTransitionEffectFade *fade = [[AliyunTransitionEffectFade alloc] init];
    fade.overlapDuration = 10;
    [self.editor applyTransition:fade atIndex:idx];
  • 动画效果

    3.7.0版本开始,继承AliyunClip和AliyunEffectPasterBase的对象都具有增加动画功能,动画的基类是AliyunAction。

    当前版本SDK子类动画如下:
    AliyunMoveAction            //移动动画
    AliyunScaleAction            //缩放动画
    AliyunRotateAction            //旋转动画
    AliyunRotateToAction        //旋转到某个弧度的动画
    AliyunRotateByAction        //从当前弧度旋转某个弧度的动画
    AliyunRotateRepeatAction    //重复旋转动画
    AliyunAlphaAction            //透明度动图
    AliyunCustomAction            //自定义动画
    说明 动画相关的具体类包含的接口请参考接口文档。
    AliyunEditor中提供增删动画的相关接口如下:
    配置项 配置实例
    添加帧动画
    /**
    API_AVAILABLE(3.7.0)
    注意:主流不支持alpha帧动画
    @param obj 动画作用的对象
    @param action 动画
    */
    - (void)add:(id<AliyunActionProtocol>)obj withFrameAnimation:(AliyunAction *)action;
    删除帧动画
    /**
    API_AVAILABLE(3.7.0)
    @param obj 动画作用的对象
    @param action 动画
    */
    - (void)remove:(id<AliyunActionProtocol>)obj withFrameAnimation:(AliyunAction *)action;
    AliyunClip中提供的动画接口如下:
    配置项 配置实例
    添加动画
    /**
    API_AVAILABLE(3.7.0)
    注意:主流不支持alpha帧动画。
    @param action 动画
    */
    - (void)runAction:(AliyunAction *)action;
    停止动画
    /**
    API_AVAILABLE(3.7.0)
    @param action 动画
    */
    - (void)stopAction:(AliyunAction *)action;
    获取全部动画
    /**
    API_AVAILABLE(3.7.0)
    @return 动画数组
    */
    - (NSArray *)allActions;
    AliyunEffectPasterBase中提供的动画接口如下:
    配置项 配置实例
    添加动画
    /**
    API_AVAILABLE(3.7.0)
    @param action 动画
    */
    - (void)runAction:(AliyunAction *)action;
    停止动画
    /**
    API_AVAILABLE(3.7.0)
    @param action 动画
    */- (void)stopAction:(AliyunAction *)action;- (void)stopAllActions;
    示例通过编辑接口将一张静态贴纸透明处理如下:
    AliyunAlphaAction *alphaAction = [[AliyunAlphaAction alloc] init];
    alphaAction.targetID = [_staticImage effectVid]; //必须要设置左右对象的id
    alphaAction.startTime = 3;
    alphaAction.duration = 2;
    alphaAction.fromAlpha = 0.0;
    alphaAction.toAlpha = 1.0;
    [self.editor add:_staticImage withFrameAnimation:alphaAction];
    通过AliyunClip和AliyunEffectPasterBase处理的示例如下:
    AliyunAlphaAction *alphaAction = [[AliyunAlphaAction alloc] init];
    alphaAction.startTime = [pasterController pasterStartTime];
    alphaAction.duration = 1;
    alphaAction.fromAlpha = 0.0f;
    alphaAction.toAlpha = 1.0f;
    [effectPaster runAction:alphaAction];
    如果您熟悉OpenGL Shading Language,可以使用AliyunCustomAction自定义动画,示例如下:
    AliyunCustomAction *customAction = [[AliyunCustomAction alloc] init];
    customAction.startTime = [pasterController pasterStartTime];
    customAction.duration = 0.5;
    customAction.fragmentShader = @"precision mediump float; uniform sampler2D inputImageTexture; uniform float uAlpha; varying vec2 textureCoordinate; uniform float offset; float w = 0.2; float g = 1.0; uniform int direction; uniform int wipeMode;const int LEFT = 0;const int TOP = 1;const int RIGHT = 2;const int BOTTOM = 3;const int APPEAR = 0;const int DISAPPEAR = 1;void main(){vec4 gamma = vec4(g, g, g, 1.0);vec4 color0 = pow(texture2D(inputImageTexture, textureCoordinate), gamma);float correction = mix(w, -w, offset);float coord = textureCoordinate.x;if(direction == LEFT){coord = 1.0 - textureCoordinate.x;}else if(direction == RIGHT){coord = textureCoordinate.x;}else if(direction == TOP){coord = 1.0 - textureCoordinate.y;}else if(direction == BOTTOM){coord = textureCoordinate.y;}float choose = smoothstep(offset - w, offset + w, coord + correction); float alpha = choose;if(wipeMode == APPEAR){alpha = 1.0 - choose;}else if(wipeMode == DISAPPEAR){alpha = choose;}gl_FragColor = vec4(color0.r,color0.g,color0.b,color0.a*alpha);}";
    customAction.customUniformsMapper = @{@"direction": @[@0],
                                          @"wipeMode":@[@0],
                                          @"offset":@[@0.0,@1.0],
                                          };[effectPaster runAction:customAction];
    说明 示例中自定义的fragmentShader和customUniformsMapper,表示进行“线性擦除”的动画效果。
  • 自定义渲染

    短视频SDK通过接口提供原始和渲染后的纹理id,您可以在渲染流程中加入自定义渲染。如需自定义渲染,需实现shader,反之不需要。

    实现自定渲染需要实现AliyunIRenderCallback代理回调:
    /**
     自定义渲染接口,SDK渲染前纹理回调
     @param srcTexture 原始视频帧纹理id
     @param size 原始视频帧纹理size
     @return 返回纹理id
     */
    - (int)customRender:(int)srcTexture size:(CGSize)size;
    /**
     自定义渲染接口,SDK渲染后纹理回调
     @param srcTexture 原始视频帧纹理id
     @param size 原始视频帧纹理size
     @return 返回纹理id
     */
    - (int)textureRender:(int)srcTexture size:(CGSize)size;
  • 填充裁剪模式
    通过AliyunEffectRunningDisplayMode,可以实现播放器进行播放时动态切换填充模式或裁剪模式。相关接口如下:
    @property(nonatomic, assign) float streamStartTime; //开始时间
    @property(nonatomic, assign) float streamEndTime; //结束时间
    @property(nonatomic, assign) AliyunRunningMode mode;//AliyunRunningModeFit:裁剪 AliyunRunningModeFill:填充
    @property(nonatomic, assign) int targetStreamId;//作用的目标流的id
    示例
    AliyunEffectRunningDisplayMode *displayMode = [[AliyunEffectRunningDisplayMode alloc ] init];
    displayMode.streamStartTime = 0; //设置播放模式的开始时间
    displayMode.streamEndTime = 4;   //设置播放模式的结束时间
    displayMode.mode = AliyunRunningModeFill;//设置播放的模式 填充或者裁剪
    displayMode.targetStreamId = clip.streamId; //设置作用的流的id
    [self.editor applyRunningDisplayMode:displayMode];

合成导出

配置项 配置实例
获取导出实例
- (id<AliyunIExporter>)getExporter;
合成导出
 - (int)startExport:(NSString *)outputPath;
取消导出
 -(int)cancelExport;
实现合成导出状态的监听,需要实现delegate代理的AliyunIExporterCallback协议,回调方法如下:
配置项 配置实例
导出开始
- (void)exporterDidStart;
导出结束
/**
@param outputPath 输出文件路径
*/
- (void)exporterDidEnd:(NSString *)outputPath;
导出取消
- (void)exporterDidCancel;
导出进度
/**
@param progress 0-1
*/
- (void)exportProgress:(float)progress;
导出异常
/**
@param errorCode 错误码
*/
- (void)exportError:(int)errorCode;