短视频SDK提供视频编辑与导出功能,支持视频图片素材混合导入、滤镜、配音、时间特效、过渡效果等丰富的编辑效果。
版本差异
版本 | 功能描述 |
---|---|
专业版 | 支持所有功能。 |
标准版 | 支持基础功能,高级功能需要License授权。 |
基础版 | 不支持导入和编辑功能。 |
导入编辑

- 编辑核心类AliyunIEditor。
- startEdit和stopEdit两者成对出现,调用startEdit方法后SDK内部会创建相关资源,调用stopEdit方法后SDK内部会销毁相关资源,页面销毁前必须调用stopEdit,否则会导致内存泄露。
- 媒体片段需要在开始编辑前确定,因此媒体片段管理接口AliyunIClipConstructor的调用在startEdit之前。
- 播放控制,编辑功能和合成导出的接口调用在startEdit和stopEdit之间。
初始化配置
- 生成TaskPathTaskPath是一个文件夹路径,文件夹中存放有包含视频素材路径、输出码率、GOP、分辨率等信息的配置文件以及临时文件。AliyunEditor通过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通过初始化方法创建AliyunEditor对象。
/** @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为5s。
- 总时长15s的视频,全程倒播。此时,getDuration为15s,假设getCurrentTime为6s,那么getStreamDuration为15s,getCurrentStreamTime为9s。
设置特效
- 滤镜
短视频SDK的滤镜资源存放在滤镜文件夹,滤镜文件夹包含配置文件和相关资源。AliyunEffectFilter代表一个滤镜资源,可以通过初始化方法构造一个滤镜实例,参数path是滤镜资源文件夹路径。
配置项 配置实例 生成滤镜对象 - (id)initWithFile:(NSString *)path;
添加一个滤镜 由于MV无法叠加,因此每次调用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设计示意图如下:上面的示意图中我们看到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;
- pasterManager方式
- 涂鸦
涂鸦主要涉及两个类: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;
- AliyunIPaint相关接口如下:
- 水印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];
- 动画效果
SDK 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];
合成导出
配置项 | 配置实例 |
---|---|
获取导出实例 |
|
合成导出 |
|
取消导出 |
|
实现合成导出状态的监听,需要实现delegate代理的AliyunIExporterCallback协议,回调方法如下表所示。
配置项 | 配置实例 |
---|---|
导出开始 |
|
导出结束 |
|
导出取消 |
|
导出进度 |
|
导出异常 |
|
在文档使用中是否遇到以下问题
更多建议
匿名提交