更新时间 : 2021-07-12 13:49:44
SXComposite 管理一个合成中的所有资源,包括组,轨道等。
初始化
需要通过 SXEditManager 中的方法,SXEditManager 提供了两个创建合成的方法。
如果需要在变化比例时保持合成与 SXEditManager 的大小一致,可以选择第二种创建方法。
/**
* 创建一个合成
* @param width 宽度
* @param height 高度
* @param frame 时长
* @return 合成对象,失败返回空对象
*/
- (SXComposite *)createCompositeWidth:(int)width height:(int)height frame:(int64_t)frame;
/**
* 创建大小与edit manager大小帧率一致的合成
* @note 此合成大小保持与edit manager大小一致
* @param frame 时长
* @return 合成对象,失败返回空对象
*/
- (SXComposite *)createCompositeFrame:(int64_t)frame;
SXCompositeDelegate
一个合成拥有自己的一些属性,如高度,宽度,帧速率,时间等等, 这个协议定义了有关合成的属性。
@protocol SXCompositeDelegate
/**
* 合成宽度
* @return 宽度
*/
- (int)width;
/**
* 合成高度
* @return 高度
*/
- (int)height;
/**
* 合成帧率
* @return 帧率
*/
- (int)fps;
/**
* 合成帧数
* @return 帧数
*/
- (int64_t)frames;
/**
* 合成时长
* @return 时长单位为秒
*/
- (double)duration;
/**
* 合成帧数
* @return 合成的总帧数
*/
- (int64_t)durationInFrame;
/**
* 获取合成中轨道的最大结束时间
* @param excludeAudio 是否排除音频时长
* @return 轨道的最大结束时间
*/
- (double)contentMaxTime:(bool)excludeAudio;
/**
* 设置合成时长
* @param frame 帧数
*/
- (void)setDurationInFrame:(int64_t)frame;
/**
* 设置合成时长,时长会转换为对应的帧数保存
* @param seconds 时长,单位为秒
*/
- (void)setDuration:(double)seconds;
@end
SXTrackDataDelegate
合成中包含自己的组和轨道,该协议定了相关的管理方法。
注意包含在合成中的组和轨道无法通过 SXEditManager 获取,只能通过合成获取。
@protocol SXTrackDataDelegate
/**
* 通过id获取对应的组,id可通过类方法uuid获取
* @param groupId 组的uuid
* @return 组的实例对象,不存在对应的组时返回nullptr
*/
- (SXTrackGroup *)group:(NSString *)groupId;
/**
* 在最后方追加一个新组
* @return 新组的实例对象
*/
- (SXTrackGroup *)addNewGroup;
/**
* 组是顺序存储的,因此可以在index所在的位置插入一个组
* @param index 位置的索引,index超出组个数时等价于addNewGroup
* @return 新组的实例对象
*/
- (SXTrackGroup *)insertNewGroupAt:(int)index;
/**
* 通过id删除组,如果组内存在轨道则会移除所有轨道,但不会删除轨道
* @param groupId 组的唯一id
*/
- (void)deleteGroup:(NSString *)groupId;
/**
* 移动一个组到指定的位置
* @param groupId 组的唯一id
* @param index 组的顺序索引,从0开始(不包含主轨道和当前轨道)
*/
- (void)moveGroup:(NSString *)groupId toIndex:(int)index;
/**
* 获取所有的组
* @return 顺序存储的所有组
*/
- (NSArray *)groups;
/**
* 创建媒体轨道,接受视频和图片素材
* @param resource 资源对象
* @return 媒体轨道
*/
- (SXMediaTrack *)createMediaTrack:(SXResource *)resource;
/**
* 创建贴纸轨道
* @param resource 资源对象
* @param duration 持续时长
* @return 贴纸轨道
*/
- (SXStickerTrack *)createStickerTrack:(SXResource *)resource duration:(double)duration;
/**
* 创建文字轨道
* @param duration 持续时长
* @return 文字轨道
* */
- (SXTextTrack *)createTextTrack:(double)duration;
/**
* 创建音频轨道
* @param resource 资源对象
* @return 音频轨道
* */
- (SXAudioTrack *)createAudioTrack:(SXResource *)resource;
/**
* 通过轨道id删除一个轨道, 该track将被释放,后续不能再使用
* @param trackId 轨道id
*/
- (void)deleteTrack:(NSString *)trackId;
/**
* 通过轨道id复制一个新的轨道
* @param trackId 轨道id
* @return 新的轨道,复制失败时返回空指针
*/
- (SXTrack *)cloneTrack:(NSString *)trackId;
/**
* 根据point查找画布中的track
*
* @param point 相对于画布左上角点的坐标
*
* @return 如果有相应的track返回对象,否则返回nil
*/
-(SXTrack *)hitPoint:(CGPoint)point;
/**
* 根据point查找画布中相应类型的track
*
* @param point 相对于画布左上角点的坐标
* @param type 需要查找的track类型
*
* @return 如果有相应的track返回对象,否则返回nil
*/
-(SXTrack *)hitPoint:(CGPoint)point type:(SXTrackType)type;
@end
用合成初始化 SXMediaTrack
一个合成中可以包含多个组,每个组中可以包含多个轨道,使用合成初始化一个 SXMediaTrack 可以在多个轨道上完成 SXMediaTrack 的特效和转场, demo 中的主轨道就是这样实现的。
_mainComposite = [_editManager createCompositeFrame: 0];
_mainTrack = [_editManager createMediaTrackWithComposite:_mainComposite];
修改时间
每个合成拥有自己的 duration,所以在修改包含合成的媒体轨道的 duration 时还需要同时修改合成的 duration。
double duration = [_mainComposite contentMaxTime:YES];
_mainTrack.duration = duration;
_mainComposite.duration = duration;
SXComposite 管理一个合成中的所有资源,包括组,轨道等。
初始化
需要通过 SXEditManager 中的方法,SXEditManager 提供了两个创建合成的方法。
如果需要在变化比例时保持合成与 SXEditManager 的大小一致,可以选择第二种创建方法。
/**
* 创建一个合成
* @param width 宽度
* @param height 高度
* @param frame 时长
* @return 合成对象,失败返回空对象
*/
- (SXComposite *)createCompositeWidth:(int)width height:(int)height frame:(int64_t)frame;
/**
* 创建大小与edit manager大小帧率一致的合成
* @note 此合成大小保持与edit manager大小一致
* @param frame 时长
* @return 合成对象,失败返回空对象
*/
- (SXComposite *)createCompositeFrame:(int64_t)frame;
SXCompositeDelegate
一个合成拥有自己的一些属性,如高度,宽度,帧速率,时间等等, 这个协议定义了有关合成的属性。
@protocol SXCompositeDelegate
/**
* 合成宽度
* @return 宽度
*/
- (int)width;
/**
* 合成高度
* @return 高度
*/
- (int)height;
/**
* 合成帧率
* @return 帧率
*/
- (int)fps;
/**
* 合成帧数
* @return 帧数
*/
- (int64_t)frames;
/**
* 合成时长
* @return 时长单位为秒
*/
- (double)duration;
/**
* 合成帧数
* @return 合成的总帧数
*/
- (int64_t)durationInFrame;
/**
* 获取合成中轨道的最大结束时间
* @param excludeAudio 是否排除音频时长
* @return 轨道的最大结束时间
*/
- (double)contentMaxTime:(bool)excludeAudio;
/**
* 设置合成时长
* @param frame 帧数
*/
- (void)setDurationInFrame:(int64_t)frame;
/**
* 设置合成时长,时长会转换为对应的帧数保存
* @param seconds 时长,单位为秒
*/
- (void)setDuration:(double)seconds;
@end
SXTrackDataDelegate
合成中包含自己的组和轨道,该协议定了相关的管理方法。
注意包含在合成中的组和轨道无法通过 SXEditManager 获取,只能通过合成获取。
@protocol SXTrackDataDelegate
/**
* 通过id获取对应的组,id可通过类方法uuid获取
* @param groupId 组的uuid
* @return 组的实例对象,不存在对应的组时返回nullptr
*/
- (SXTrackGroup *)group:(NSString *)groupId;
/**
* 在最后方追加一个新组
* @return 新组的实例对象
*/
- (SXTrackGroup *)addNewGroup;
/**
* 组是顺序存储的,因此可以在index所在的位置插入一个组
* @param index 位置的索引,index超出组个数时等价于addNewGroup
* @return 新组的实例对象
*/
- (SXTrackGroup *)insertNewGroupAt:(int)index;
/**
* 通过id删除组,如果组内存在轨道则会移除所有轨道,但不会删除轨道
* @param groupId 组的唯一id
*/
- (void)deleteGroup:(NSString *)groupId;
/**
* 移动一个组到指定的位置
* @param groupId 组的唯一id
* @param index 组的顺序索引,从0开始(不包含主轨道和当前轨道)
*/
- (void)moveGroup:(NSString *)groupId toIndex:(int)index;
/**
* 获取所有的组
* @return 顺序存储的所有组
*/
- (NSArray *)groups;
/**
* 创建媒体轨道,接受视频和图片素材
* @param resource 资源对象
* @return 媒体轨道
*/
- (SXMediaTrack *)createMediaTrack:(SXResource *)resource;
/**
* 创建贴纸轨道
* @param resource 资源对象
* @param duration 持续时长
* @return 贴纸轨道
*/
- (SXStickerTrack *)createStickerTrack:(SXResource *)resource duration:(double)duration;
/**
* 创建文字轨道
* @param duration 持续时长
* @return 文字轨道
* */
- (SXTextTrack *)createTextTrack:(double)duration;
/**
* 创建音频轨道
* @param resource 资源对象
* @return 音频轨道
* */
- (SXAudioTrack *)createAudioTrack:(SXResource *)resource;
/**
* 通过轨道id删除一个轨道, 该track将被释放,后续不能再使用
* @param trackId 轨道id
*/
- (void)deleteTrack:(NSString *)trackId;
/**
* 通过轨道id复制一个新的轨道
* @param trackId 轨道id
* @return 新的轨道,复制失败时返回空指针
*/
- (SXTrack *)cloneTrack:(NSString *)trackId;
/**
* 根据point查找画布中的track
*
* @param point 相对于画布左上角点的坐标
*
* @return 如果有相应的track返回对象,否则返回nil
*/
-(SXTrack *)hitPoint:(CGPoint)point;
/**
* 根据point查找画布中相应类型的track
*
* @param point 相对于画布左上角点的坐标
* @param type 需要查找的track类型
*
* @return 如果有相应的track返回对象,否则返回nil
*/
-(SXTrack *)hitPoint:(CGPoint)point type:(SXTrackType)type;
@end
用合成初始化 SXMediaTrack
一个合成中可以包含多个组,每个组中可以包含多个轨道,使用合成初始化一个 SXMediaTrack 可以在多个轨道上完成 SXMediaTrack 的特效和转场, demo 中的主轨道就是这样实现的。
_mainComposite = [_editManager createCompositeFrame: 0];
_mainTrack = [_editManager createMediaTrackWithComposite:_mainComposite];
修改时间
每个合成拥有自己的 duration,所以在修改包含合成的媒体轨道的 duration 时还需要同时修改合成的 duration。
double duration = [_mainComposite contentMaxTime:YES];
_mainTrack.duration = duration;
_mainComposite.duration = duration;