音视频编辑导出引擎架构设计--支持视频+相片+贴纸+特效+转场+画面宫格进行编辑预览合成
随着社交类APP抖音快手带动短视频行业的爆火,越来越多的行业参与到了短视频这个领域。
之前在腾讯主要负责了发布器引擎相关开发与设计,一直在思考如何实现一套比较完美的音视频编辑引擎,可以在支持扩展的情况下,又极大的保持性能与内存占用的最小化实现.
对比了行业内常见三种音视频引擎实现方案在性能及扩展能力方面的指标,最终决定了当前开源音视频引擎架构原型。
希望可以帮助更多的使用者可以在这块少走一些弯路、少掉一些坑,以更加合理的功能架构设计,在实现当前需求的功能前提下,为以后产品功能的快速迭代预留好新增功能的接口。同时在性能提升方面尽可能做到极致,占用更少的内存CPU资源
- 多视频合成框架
- 支持不同分辩率,不同码率视频合成为一个分辩率一个码率的视频文件(分辩率及码率可以自适应,也可以使用指定参数)
- 支持横竖屏强转
- 支持单个视频资源,在资源的时长范围内,指定片段或者全时长使用特效资源
- 相册与视频混拍合成框架
- 视频与相片转场框架
- 目前已支持抖音常见消融 画面分格碎裂 擦除 左右上下 百叶窗 淡入淡出 波纹等效果
- 多画面拼接场景支持
- 抖音常见的三格左中右 四格 9宫格均支持,另外支持自定义形状GLSL渲染
- 支持各种视频特效
- 目前已实现 支持LUT,波纹,mask视频等
- 支持视频资源全局特效及水印贴纸功能添加
- 支持视频添加贴纸
- 支持添加背景音乐 支持混音功能
- 以上所有功能均支持动态下发
- 特效底层框架使用自定义GPU框架
- 转场/特效/贴纸/音频/宫格 资源描述
- 转场/特效/贴纸/音频/宫格 时间线排布
- 滤镜链树状资源时间线排布资源管理
- 支持特效限定区间,
- 不同区间参数动态调整
- 资源使用中创建,使用完立即释放
- 滤镜链优化管理
- 减少视频合成时长
- 减少视频合成中内存占用
-
视频预览
-
粒子特效实现
-
人脸模型支持
-
3D贴纸支持
-
AR场景支持
-
AI特效引入
-
字幕引入
BBZVideoModel *videoModel = [[BBZVideoModel alloc] init];
NSString *path = [[NSBundle mainBundle] pathForResource:@"IMG_7305" ofType:@"HEIC" inDirectory:@"Resource"];
[videoModel addImageSource:path];
NSString *path = [[NSBundle mainBundle] pathForResource:@"douyin3" ofType:@"mp4" inDirectory:@"Resource"];
[videoModel addVideoSource:path];
NSString *path = [[NSBundle mainBundle] pathForResource:@"jimoshazhouleng" ofType:@"mp3" inDirectory:@"Resource"];
[videoModel addAudioSource:path];
NSString *path = [NSString stringWithFormat:@"%@/Resource/demo2", [[NSBundle mainBundle] bundlePath]];
[videoModel addTransitionGroup:path];
NSString *path = [[NSBundle mainBundle] pathForResource:@"IMG_7305" ofType:@"HEIC" inDirectory:@"Resource"];
NSData *data = [NSData dataWithContentsOfFile:path];
UIImage *bgImage = [UIImage imageWithData:data];
videoModel.bgImage = bgImage;
BBZTransformItem *transformItem = [[BBZTransformItem alloc] init];
transformItem.scale = 0.8;
transformItem.angle = 45.0;
videoModel.transform = transformItem;
NSMutableArray *multiArray = [NSMutableArray array];
for (int i = 1; i < 10; i++) {
NSString *strName = [NSString stringWithFormat:@"00%d@2x", i];
NSString *icon = [[NSBundle mainBundle] pathForResource:strName ofType:@"png" inDirectory:@"Resource/icon"];
NSData *data = [NSData dataWithContentsOfFile:icon];
UIImage *image = [UIImage imageWithData:data];
[multiArray addObject:image];
}
videoModel.maskImage = multiArray;
BBZExportTask *task = [BBZExportTask taskWithModel:videoModel];
task.completeBlock = ^(BOOL sucess, NSError *error) {
};
task.progressBlock = ^(CGFloat progress) {
};
[task start];
当然写这个框架是利用了一些业余时间来完成的,还有一些功能点未进行开发