确保申请到有效的License
制作/购买模版素材,并获取素材包
pod 'EffectOneKit', '1.3.0', :source => 'https://github.com/volcengine/volcengine-spces'
获取的数据主要为模版信息(模版标题,模版预览视频等)。主要两个作用,第一提供页面展示信息数据,第二构造后续模版重演流程需要的数据
后续素材选择和模版重演播放均需要模版槽位信息,模版槽位信息包括素材路径,素材类型
将可变槽位,填充成为自定义的素材,一般为相册资源
将模版和自定义资源合成为一个视频,主要进行以下处理:
对素材进行压缩处理,减少素材分辨率,提高重演效率。
根据模版制作规则,按需对素材进行倒放处理。
指将合成后的视频进行预览播放
设置鉴权配置,SDK鉴权相关的配置
EOAuthorizationConfig *config = [[EOAuthorizationConfig alloc] initWithBlock:^(EOAuthorizationConfigInitializer * _Nonnull initializer) { initializer.isOnline = NO; // 配置指向鉴权文件路径 initializer.licensePathForOffline = [[NSBundle mainBundle] pathForResource:@"com.volcengine.effectone.licbag" ofType:nil]; }];
[[EOAuthorization sharedInstance] makeAuthWithConfig:config completionHandler:^(BOOL success, NSString * _Nonnull errMsg) { [CSIFCutSameSDK setupWithCompletion:^(CSIFCutSameStatus status) { if (status == CSIFCutSameStatusReady) { // 剪同款鉴权成功 } }];
鉴权初始化成功以后,初始化剪同款SDK相关的配置
// EffectOne 全局初始化 [EOSDK initSDK:^{ }];
如果使用素材SDK进行模版列表拉取,则可通过如下接口获取模版。如果自行拉取模版素材,则跳过这一步
[EOInjectContainer.shared.resourceLoaderSharedImpl loadConfigByPanelKey:EOPanelKeyCutSame localOnly:NO completion:^(NSString * _Nonnull panelKey, NSArray<id<EOResourceProtocol>> * _Nullable tabs, NSError * _Nullable error) { }];
剪同款模板素材如何使用素材SDK进行管理,参考 SDK功能详解
创建CSIFCutSameSource对象,用来对资源进行管理
+ (CSIFCutSameSource * _Nonnull)createSourceFromTemplatePath:(NSString * _Nonnull)path
// 传入模版路径 CSIFCutSameSource *source = [CSIFCutSameSDK createSourceFromTemplatePath:@"xxx"];
解析模板,获取模板的槽位信息
- (void)prepareTemplateWithProgress:(nullable void(^)(CGFloat))progress completion:(nullable void(^)(NLEModel_OC * _Nullable, CSIFCutSameTemplateModel * _Nullable, NSError * _Nullable, NSString * _Nullable))completion;
[self.cutsameSource prepareTemplateWithProgress:^(CGFloat progress) { } completion:^(NLEModel_OC * _Nullable nleModel, CSIFCutSameTemplateModel * _Nullable templateModel, NSError * _Nullable error, NSString * _Nullable errorMsg) { }];
选择素材后,对选择的素材进行压缩、倒放等处理
- (void)prepareSourceWithProgress:(void(^ _Nullable)(CGFloat))progress completion:(void(^ _Nullable)(NSArray<CSIFCutSameMaterialAssetModel *> *_Nullable materialAssetModels, NSError *_Nullable error))completion;
[self.cutsameSource prepareSourceWithProgress:^(CGFloat progress) { } completion:^(NSArray<CSIFCutSameMaterialAssetModel *> * _Nullable materialAssetModels, NSError * _Nullable error) { }];
创建CSIFCutSamePlayer对象,此对象提供视频预览、槽位编辑、文本编辑、视频导出等能力
+ (CSIFCutSamePlayer * _Nonnull)createPlayerWithContainerView:(UIView * _Nonnull)containerView source:(CSIFCutSameSource * _Nonnull)source;
[CSIFCutSameSDK createPlayerWithContainerView:self.playerContainer source:self.cutsameSource];
CSIFCutSamePlayer的创建依赖于CSIFCutSameSource对象
CSIFCutSamePlayer对象使用完成后,使用 destoryPlayer 方法进行销毁
使用 CSIFCutSamePlayer 对象,进行模版重演和播放控制
更多对象方法,参见 CSIFCutSamePlayer 类定义
@interface CSIFCutSamePlayer : NSObject /// 释放播放器 - (void)destoryPlayer; /// 设置播放器 - (void)resetPlayer; // 控制播放 /// 播放 - (void)play; /// 暂停 - (void)pause; /// 跳转到时间播放 /// @param time 时间点 /// @param completion 跳转后回调 - (void)seekToTime:(CMTime)time completion:(nullable dispatch_block_t)completion; /// 跳转到时间播放 /// @param time 时间点 /// @param seekMode seek模式 0:smooth 1:Accurate /// @param completion 跳转后回调 - (void)seekToTime:(CMTime)time seekMode:(int)seekMode completion:(nullable dispatch_block_t)completion; @end
[self.cutsamePlayer play];
获取模板的媒体素材,即模板的可变槽位信息
@interface CSIFCutSameTemplateModel : CSIFBaseModel @property (nonatomic, copy, nullable) NSArray<CSIFCutSameFragmentModel *> *fragments; @end
[self.cutsameSource prepareTemplateWithProgress:^(CGFloat progress) { } completion:^(NLEModel_OC * _Nullable nleModel, CSIFCutSameTemplateModel * _Nullable templateModel, NSError * _Nullable error, NSString * _Nullable errorMsg) { // 可在回调用获取 self.fragments = templateModel.fragments; }];
支持替换媒体素材功能,即替换槽位素材
// CSIFCutSameSource - (void)replaceAsset:(CSIFAssetModel *)originAsset withAsset:(CSIFAssetModel *)newAsset progress:(void (^)(CGFloat))progress completion:(void (^)(CSIFCutSameMaterialAssetModel *model, NSError *error))completion; // CSIFCutSamePlayer - (BOOL)replaceFragmentWithAsset:(CSIFCutSameMaterialAssetModel *)asset withPayloadID:(NSString *)payloadId;
[self.cutsameSource replaceAsset:originAsset withAsset:newAsset progress:^(CGFloat progress) { } completion:^(CSIFCutSameMaterialAssetModel *martrialAsset, NSError *error) { [self.cutSamePlayer replaceFragmentWithAsset:martrialAsset withPayloadID:fragment.payloadID]; }];
获取模版文本素材
@interface CSIFCutSamePlayer (EditText) @property (nonatomic, copy, readonly) NSArray<CSIFTemplateTextFragment *> *_Nullable canReplaceTextFragments; @end
NSArray<CSIFTemplateTextFragment *> *textFragments = player.canReplaceTextFragments;
支持编辑模版文本功能
- (BOOL)updateTextFragment:(nonnull CSIFTemplateTextFragment *)fragment withText:(nonnull NSString *)text;
[cutSamePlayer updateTextFragment:textFragment withText:@"new text"];
支持控制播放,如开始、暂停、以及Seek到指定时间
@interface CSIFCutSamePlayer : NSObject /// 释放播放器 - (void)destoryPlayer; /// 设置播放器 - (void)resetPlayer; // 控制播放 /// 播放 - (void)play; /// 暂停 - (void)pause; /// 跳转到时间播放 /// @param time 时间点 /// @param completion 跳转后回调 - (void)seekToTime:(CMTime)time completion:(nullable dispatch_block_t)completion; /// 跳转到时间播放 /// @param time 时间点 /// @param seekMode seek模式 0:smooth 1:Accurate /// @param completion 跳转后回调 - (void)seekToTime:(CMTime)time seekMode:(int)seekMode completion:(nullable dispatch_block_t)completion; @end
[self.cutsamePlayer play];
- (BOOL)modifyFragmentWithInfo:(NSDictionary *)info payloadID:(NSString *)payloadId
[cutSamePlayer modifyFragmentWithInfo:@{CSIFCutSamePlayerInfoKeyVolume: @(volume)} payloadID:fragment.payloadID];
- (NSDictionary *)metaInfoForVideoFragment:(CSIFTemplateVideoEditFragment *)fragment
NSNumber *volumeValue = [self.cutSamePlayer metaInfoForVideoFragment:self.displayFragments[self.curEditIndex]][CSIFCutSamePlayerInfoKeyVolume];
将重演后的视频导出到本地
- (void)exportVideoWithConfig:(CSIFVideoExportConfig * _Nonnull)config progress:(void (^ _Nullable)(CGFloat))progress completion:(void (^ _Nullable)(NSURL * _Nullable videoURL, NSError * _Nullable error))completion
[self.cutsamePlayer exportVideoWithConfig:config progress:^(CGFloat progress) { } completion:^(NSURL * _Nullable videoURL, NSError * _Nullable error) { }];
获取某个时间点的截图
- (void)getVideoFrameWithTime:(CMTime)time completion:(void(^ _Nonnull)(UIImage * _Nullable, NSError * _Nullable))completion;
[self.cutSamePlayer getVideoFrameWithTime:CMTimeMake(1, 10) completion:^(UIImage *image, NSError *error) { }];
// 将清除在编辑过程中产生的中间文件 // 使用完剪同款功能功能时可用 [CSIFCutSameSDK clearDrafts];