iOS 视频剪切、旋转,视频添加音频、添加水印,视频导出

http://www.jianshu.com/p/04f0e211a2f4

概述

视频处理主要是用到以下这几个类

AVMutableCompositionAVMutableVideoCompositionAVMutableAudioMixAVMutableVideoCompositionInstructionAVMutableVideoCompositionLayerInstructionAVAssetExportSession等。

其中 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



文/Amin706(简书作者)
原文链接:http://www.jianshu.com/p/04f0e211a2f4
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值