http://www.jianshu.com/p/04f0e211a2f4
概述
视频处理主要是用到以下这几个类
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 AVMutableCompositionmutableComposition;
@property AVMutableVideoCompositionmutableVideoComposition;
@property AVMutableAudioMixmutableAudioMix;
@property CALayerwatermarkLayer;
Command设计模式
视频剪切
视频头部剪切代码图
拿到视频和音频资源
创建AVMutableComposition对象
往AVMutableComposition对象添加视频资源,同时设置视频资源的时间段和插入点
往AVMutableComposition对象添加音频资源,同时设置音频资源的时间段和插入点
视频旋转
在查有关视频旋转的资料的时候查看了一篇很不错的参考资料,在这里给大家安利一下
http://blog.csdn.net/likendsl/article/details/7595611讲的是矩阵运算的原理,对视图的矩阵操作的相关内容。
视频旋转代码图1
视频旋转代码图2
视频旋转代码图3
拿到视频和音频资源
创建AVMutableComposition对象
往AVMutableComposition对象添加视频资源,同时设置视频资源的时间段和插入点
往AVMutableComposition对象添加音频资源,同时设置音频资源的时间段和插入点
设置旋转矩阵变换
创建AVMutableVideoComposition对象
设置视频的渲染宽高和Frame
创建视频组合指令AVMutableVideoCompositionInstruction,并设置指令在视频的作用时间范围和旋转矩阵变换
创建视频组合图层指令AVMutableVideoCompositionLayerInstruction,并设置图层指令在视频的作用时间范围和旋转矩阵变换
把视频图层指令放到视频指令中,再放入视频组合对象中
这里给出不同旋转角度的案例代码,希望能够对你起帮助,节省你的时间。
CGAffineTransformtranslateToCenter;
if(self.degrees!=0) {
CGAffineTransformmixedTransform;
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);
}elseif(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 = [AVMutableVideoCompositionInstructionvideoCompositionInstruction]; roateInstruction.timeRange= CMTimeRangeMake(kCMTimeZero, [mixComposition duration]);
AVMutableVideoCompositionLayerInstruction*roateLayerInstruction = [AVMutableVideoCompositionLayerInstructionvideoCompositionLayerInstructionWithAssetTrack:mixedVideoTrack];
[roateLayerInstruction setTransform:mixedTransform atTime:kCMTimeZero]; roateInstruction.layerInstructions= @[roateLayerInstruction];//将视频方向旋转加入到视频处理中waterMarkVideoComposition.instructions= @[roateInstruction]; }
视频添加音频
视频添加音频代码图1
视频添加音频代码图2
拿到视频和音频资源
创建AVMutableComposition对象
往AVMutableComposition对象添加视频资源,同时设置视频资源的时间段和插入点
往AVMutableComposition对象添加音频资源,同时设置音频资源的时间段和插入点
往AVMutableComposition对象添加要追加的音频资源,同时设置音频资源的时间段,插入点和混合模式
视频添加水印
视频添加水印1
视频添加水印2
拿到视频和音频资源
创建AVMutableComposition对象
往AVMutableComposition对象添加视频资源,同时设置视频资源的时间段和插入点
往AVMutableComposition对象添加音频资源,同时设置音频资源的时间段和插入点
创建视频组合器对象 AVMutableVideoComposition 并设置frame和渲染宽高
创建视频组合器指令对象,设置指令的作用范围
创建视频组合器图层指令对象,设置指令的作用范围
视频组合器图层指令对象 放入 视频组合器指令对象中
视频组合器指令对象放入视频组合器对象
创建水印图层Layer并设置frame和水印的位置,并将水印加入视频组合器中
视频导出
视频导出
创建输出路径
根据AVMutableComposition对象创建AVAssetExportSession视频导出对象
设置AVAssetExportSession的AVMutableVideoComposition对象,AVMutableAudioMix对象,视频导出路径,视频导出格式
异步导出视频,根据导出结果做对应处理。
http://blog.csdn.net/lishichao706/article/details/51063515
原文链接:http://www.jianshu.com/p/04f0e211a2f4
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。