录制:支持可配置参数摄像头录制
预览:支持录制视频和导入视频的预览,暂时支持美颜和水印的实时预览
合成:将预览视频效果导出
上传:sdk内置ks3上传
播放:金山云播放sdk
短视频SDK基于金山iOS融合库SDK 短视频SDK支持功能:
短视频录制
录制/导入视频预览编辑
录制实时美颜,滤镜
录制变声、混音、背景音
断点续拍、回删、多段合成
录制支持定时拍摄
录制支持变速功能
支持横屏录制
录制时添加MV主题包
编辑添加滤镜
编辑添加水印
编辑添加背景音
编辑添加贴纸、字幕
编辑添加音效、场景
编辑文件合成,支持VideoToolbox、libx264、H.265编码
编辑支持视频的时间段裁剪预览
编辑支持BGM的时间段裁剪预览
编辑支持倍速播放预览
支持添加片尾
合成支持输出GIF
合成文件上传KS3
上传后文件预览播放
KSYMediaEditorKit是一款免费的短视频编辑SDK,录制、编辑和播放功能都免费提供,可以用于商业集成和使用。
License说明请见wiki
短视频SDK涉及两个鉴权,区别如下:
SDK鉴权免费,但是是必需的
KS3鉴权涉及费用,但是是可选择不用的
使用KSYMediaEditorKit短视频编辑SDK前需要注册金山云帐号,SDK需要使用开发者帐号鉴权。请在此注册开发者帐号。
SDK鉴权本身不会引入付费。
为了开始开发用于SDK鉴权所需要的鉴权串,提供了服务器端鉴权需要的代码。
请见SDK鉴权说明
使用KSYMediaEditorKit短视频编辑SDK将合成的短视频上传至ks3存储时,需要满足ks3的鉴权要求。
如果您的APP不使用金山云的对象存储服务或者使用其他家云存储提供的存储或者CDN服务,上传阶段置null即可。
如果使用金山云对象存储需要开通商务帐号(涉及付费业务),请直接联系金山云商务。
KSYMediaEditorKit可以免费使用。涉及付费的包括:
涉及的云存储和CDN,具体费用请参考金山云官网
最低支持iOS版本:iOS 8.0
最低支持iPhone型号:iPhone 4
支持CPU架构: armv7,armv7s,arm64(和i386,x86_64模拟器) 含有i386和x86_64模拟器版本的库文件,录制功能无法在模拟器上工作,合成、播放功能完全支持模拟器。
4.2.1 cocoaPods集成方式
目录结构如下所示:
pod 'GPUImage', '~> 0.1.7'
pod 'libksygpulive', '~> 2.4.0'
pod 'KSYMediaEditorKit', '~> 0.7.4'
pod 'Ks3SDK', '~> 1.7.2'
4.2.2 从oschina clone
为了加速国内访问,oschina有KSYMediaEditorKit完整镜像,请在podfile中修改库地址
https://git.oschina.net/ksvc/ksymediaeditorkit_ios.git
请参考官方cocoapods提供的GPUImage,当前我们测试通过的版本是0.1.7
4.4.1 使用Cocoapod的的方式来运行demo
demo 目录中已经有一个Podfile, 指定了本地开发版的pod 在demo目录下执行如下命令, 即可开始编译运行demo
$ pod install
$ open demo.xcworkspace
注意:
更新pod之后, 需要打开 xcwrokspace, 而不是xcodeproj
视频录制 当前视频录制依赖金山云推流播放SDK融合版,具体请参考 https://github.com/ksvc/KSYLive_iOS/wiki/shortVideoRecord
视频编辑 短视频sdk目前暴漏的类为
sdk内置ks3上传功能,用户无需关心复杂的上传逻辑,只需要简单的接口掉用即可上传视频到KS3,关于KS3服务,请联系商务
短视频sdk必须联系联系商务开通服务,客户端如果没有成功鉴权只能预览编辑,无法合成视频。
KSYMediaEditor类封装了一系列接口方便用户进行视频预览、编辑、合成
- (KSYStatusCode)addVideo:(NSString *)path;
调用者需要判断[KSYStatusCode][KSYStatusCode]的状态以确保添加成功
- (void)setupPlayView:(UIView *)view;
该函数必先在调用了addView之后调用
- (void)setWaterMark:(KSYWaterMarkCfg *)waterMark;
你可以给你的视频添加一个水印,水印参数参考[KSYWaterMarkCfg][KSYWaterMarkCfg]
添加一个滤镜 sdk支持添加内置滤镜和GPUImge提供的滤镜
KSYFilterCfg *cfg = [[KSYFilterCfg alloc] init];
cfg.filterKey = KSYFilterBeautifyFace;
[_editor setupFilter:self.filterCfg];
GPUImageSepiaFilter *filter = [[GPUImageSepiaFilter alloc] init];
KSYFilterCfg *cfg = [[KSYFilterCfg alloc] initWithFilter:filter];
cfg.filter = filter;
[_editor setupFilter:cfg];
用户也可以根据GPUImage的框架拓展其他滤镜
//开始预览视频
- (void)startPreview;
//暂停视频预览
- (void)pausePreview;
//停止预览视频
- (void)stopPreView;
以上3个函数控制视频的播放
在合成之前,必须设置视频输出参数,通过KSYMediaEditor的outputSettings属性设置,支持的值如下
// 输出视频的编码格式
FOUNDATION_EXPORT NSString *const KSYVideoOutputCodec;
// 输出视频的宽
FOUNDATION_EXPORT NSString *const kSYVideoOutputWidth;
// 输出视频的高
FOUNDATION_EXPORT NSString *const kSYVideoOutputHeight;
// 输出视频的视频频码率
FOUNDATION_EXPORT NSString *const KSYVideoOutputVideoBitrate;
// 输出视频的帧率
FOUNDATION_EXPORT NSString *const KSYVideoOutputFramerate;
// 输出视频的音频码率
FOUNDATION_EXPORT NSString *const KSYVideoOutputAudioBitrate;
调用下面的函数开始合成
- (void)startProcessVideo;
用户使用delegate接收sdk内部的状态回调 通过下面的属性设置delegate
[KSYMediaEditor sharedInstance].delegate
实现onComposeFinish协议以接收合成完成的回调
实现onErrorOccur:err:extraStr以接收sdk内部的处理错误码
实现onUploadProgressChanged以接收KS3上传进度
实现onKS3UploadFinish以接收上传完成的通知
SDK支持KS3上传逻辑,不设置bucketName将不会触发上传逻辑
合成完成后,会收到onComposeFinish的回调, 合成之后用户需要向自己的服务器请求上传信息,包括 KSYUploadBucketName、KSYUploadObjKey2个字段
然后调用setUploadParams设置ks3上传的信息
上传还需要一个token,经过步骤2的设置后在setUploadParams的第二个参数block中返回一系列参数(HttpMethod、ContentType、Resource、Headers、ContentMd5),使用者拿着这些参数向自己的服务器请求token及Date信息
当获取到token及Date信息之后通过KSYUploadWithTokenBlock block函数设置这些信息,sdk内部自动上传
通过onUploadProgressChanged取得上传进度,当收到onKS3UploadFinish表明上传成功,收到onErrorOccur表明上传出错,具体的错误类型参考KSYStatusCode 参考代码
KSYMediaEditor *editor = [KSYMediaEditor sharedInstance];
editor.delegate = self;
NSString *bundleId = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"];
NSString *objKey = [NSString stringWithFormat:@"%@/%ld.mp4",bundleId,time(NULL)];
NSDictionary *uploadparams = @{KSYUploadBucketName : @"ksvsdemo",
KSYUploadObjKey : objKey
};
__weak typeof(self) weakSelf = self;
//设置上传参数 block
[editor setUploadParams:uploadparams uploadParamblock:^(NSDictionary *params, KSYUploadWithTokenBlock block) {
[weakSelf requestKS3TokenWith:params complete:^(NSString *ks3Token, NSString *strDate) {
//客户获取到token及date信息后调用block设置这些信息,发起上传
block(ks3Token, strDate);
}];
}];