扫一扫咨询方案
English
中文
English
登录/注册

{user.username}

ID: {user.id}

剪辑 SDK 文档

SDK > iOS SDK > 剪辑合成类—SXComposite

剪辑合成类—SXComposite

更新时间 : 2021-07-12 13:49:44

SXComposite

SXComposite 管理一个合成中的所有资源,包括组,轨道等。

  1. 初始化

    需要通过 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;
  2. 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
  3. 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
  4. 用合成初始化 SXMediaTrack

    一个合成中可以包含多个组,每个组中可以包含多个轨道,使用合成初始化一个 SXMediaTrack 可以在多个轨道上完成 SXMediaTrack 的特效和转场, demo 中的主轨道就是这样实现的。

    _mainComposite = [_editManager createCompositeFrame: 0];
    _mainTrack = [_editManager createMediaTrackWithComposite:_mainComposite];
  5. 修改时间

    每个合成拥有自己的 duration,所以在修改包含合成的媒体轨道的 duration 时还需要同时修改合成的 duration。

    double duration = [_mainComposite contentMaxTime:YES];
    _mainTrack.duration = duration;
    _mainComposite.duration = duration;