概述
视频处理主要是用到以下这几个类
- AVMutableComposition、
- AVMutableVideoComposition、
- AVMutableAudioMix、
- AVMutableVideoCompositionInstruction、
- AVMutableVideoCompositionLayerInstruction、
- AVAssetExportSession
其中 AVMutableComposition 可以用来操作音频和视频的组合,AVMutableVideoComposition 可以用来对视频进行操作,AVMutableAudioMix 类是给视频添加音频的,AVMutableVideoCompositionInstruction和AVMutableVideoCompositionLayerInstruction 一般都是配合使用,用来给视频添加水印或者旋转视频方向,AVAssetExportSession 是用来进行视频导出操作的。需要值得注意的是当App进入后台之后,会对使用到GPU的代码操作进行限制,会造成崩溃,而视频处理这些功能多数会使用到GPU,所以需要做对应的防错处理。
在这里我会使用Apple的官方Demo "AVSimpleEditoriOS" 作为讲解案例,该案例采用Command设计模式来组织代码,其中基类的AVSECommand包含了一些各个子类Command共用的属性。本文就视频相关操作做简要介绍,说明一些相关的操作,并标注一些重点代码,希望本文可以起到抛砖引玉的效果,让大家对视频剪辑处理有个初步印象,然后可以根据Apple官方Demo的内容进行相应的修改。大家可以下载相应的Apple官方Demo运行查看结果。
@property AVMutableComposition *mutableComposition;
@property AVMutableVideoComposition *mutableVideoComposition;
@property AVMutableAudioMix *mutableAudioMix;
@property CALayer *watermarkLayer;
视频剪切
- 拿到视频和音频资源
- 创建AVMutableComposition对象
- 往AVMutableComposition对象添加视频资源,同时设置视频资源的时间段和插入点
- 往AVMutableComposition对象添加音频资源,同时设置音频资源的时间段和插入点
视频旋转
在查有关视频旋转的资料的时候查看了一篇很不错的参考资料,在这里给大家安利一下
http://blog.csdn.net/likendsl/article/details/7595611 讲的是矩阵运算的原理,对视图的矩阵操作的相关内容。
- 拿到视频和音频资源
- 创建AVMutableComposition对象
- 往AVMutableComposition对象添加视频资源,同时设置视频资源的时间段和插入点
- 往AVMutableComposition对象添加音频资源,同时设置音频资源的时间段和插入点
- 设置旋转矩阵变换
- 创建AVMutableVideoComposition对象
- 设置视频的渲染宽高和Frame
- 创建视频组合指令AVMutableVideoCompositionInstruction,并设置指令在视频的作用时间范围和旋转矩阵变换
- 创建视频组合图层指令AVMutableVideoCompositionLayerInstruction,并设置图层指令在视频的作用时间范围和旋转矩阵变换
- 把视频图层指令放到视频指令中,再放入视频组合对象中
这里给出不同旋转角度的案例代码,希望能够对你起帮助,节省你的时间。
CGAffineTransform translateToCenter;
if (self.degrees != 0) {
CGAffineTransform mixedTransform;
if(self.degrees == 90){
//顺时针旋转90°
NSLog(@"视频旋转90度,home按键在左");
translateToCenter = CGAffineTransformMakeTranslation(mixedVideoTrack.naturalSize.height,0.0);
mixedTransform = CGAffineTransformRotate(translateToCenter,M_PI_2);
waterMarkVideoComposition.renderSize = CGSizeMake(mixedVideoTrack.naturalSize.height,mixedVideoTrack.naturalSize.width);
}else if(self.degrees == 180){
//顺时针旋转180°
NSLog(@"视频旋转180度,home按键在上");
translateToCenter = CGAffineTransformMakeTranslation(mixedVideoTrack.naturalSize.width, mixedVideoTrack.naturalSize.height);
mixedTransform = CGAffineTransformRotate(translateToCenter,M_PI);
waterMarkVideoComposition.renderSize = CGSizeMake(mixedVideoTrack.naturalSize.width,mixedVideoTrack.naturalSize.height);
}else if(self.degrees == 270){
//顺时针旋转270°
NSLog(@"视频旋转270度,home按键在右");
translateToCenter = CGAffineTransformMakeTranslation(0.0, assetVideoTrack.naturalSize.width);
mixedTransform = CGAffineTransformRotate(translateToCenter,M_PI_2*3.0);
waterMarkVideoComposition.renderSize = CGSizeMake(mixedVideoTrack.naturalSize.height,mixedVideoTrack.naturalSize.width);
}
AVMutableVideoCompositionInstruction *roateInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
roateInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, [mixComposition duration]);
AVMutableVideoCompositionLayerInstruction *roateLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:mixedVideoTrack];
[roateLayerInstruction setTransform:mixedTransform atTime:kCMTimeZero];
roateInstruction.layerInstructions = @[roateLayerInstruction];
//将视频方向旋转加入到视频处理中
waterMarkVideoComposition.instructions = @[roateInstruction];
}
视频添加音频
- 拿到视频和音频资源
- 创建AVMutableComposition对象
- 往AVMutableComposition对象添加视频资源,同时设置视频资源的时间段和插入点
- 往AVMutableComposition对象添加音频资源,同时设置音频资源的时间段和插入点
- 往AVMutableComposition对象添加要追加的音频资源,同时设置音频资源的时间段,插入点和混合模式
视频添加水印
- 拿到视频和音频资源
- 创建AVMutableComposition对象
- 往AVMutableComposition对象添加视频资源,同时设置视频资源的时间段和插入点
- 往AVMutableComposition对象添加音频资源,同时设置音频资源的时间段和插入点
- 创建视频组合器对象 AVMutableVideoComposition 并设置frame和渲染宽高
- 创建视频组合器指令对象,设置指令的作用范围
- 创建视频组合器图层指令对象,设置指令的作用范围
- 视频组合器图层指令对象 放入 视频组合器指令对象中
- 视频组合器指令对象放入视频组合器对象
- 创建水印图层Layer并设置frame和水印的位置,并将水印加入视频组合器中
视频导出
- 创建输出路径
- 根据AVMutableComposition对象创建AVAssetExportSession视频导出对象
- 设置AVAssetExportSession的AVMutableVideoComposition对象,AVMutableAudioMix对象,视频导出路径,视频导出格式
- 异步导出视频,根据导出结果做对应处理。