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

概述

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

  1. AVMutableComposition
  2. AVMutableVideoComposition
  3. AVMutableAudioMix
  4. AVMutableVideoCompositionInstruction
  5. AVMutableVideoCompositionLayerInstruction
  6. 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;

iOS 视频剪切、旋转,视频添加音频、添加水印,视频导出_第1张图片

Command设计模式

视频剪切

iOS 视频剪切、旋转,视频添加音频、添加水印,视频导出_第2张图片

视频头部剪切代码图

  1. 拿到视频和音频资源
  2. 创建AVMutableComposition对象
  3. 往AVMutableComposition对象添加视频资源,同时设置视频资源的时间段和插入点
  4. 往AVMutableComposition对象添加音频资源,同时设置音频资源的时间段和插入点

视频旋转

在查有关视频旋转的资料的时候查看了一篇很不错的参考资料,在这里给大家安利一下
http://blog.csdn.net/likendsl/article/details/7595611 讲的是矩阵运算的原理,对视图的矩阵操作的相关内容。

iOS 视频剪切、旋转,视频添加音频、添加水印,视频导出_第3张图片

视频旋转代码图1

iOS 视频剪切、旋转,视频添加音频、添加水印,视频导出_第4张图片

视频旋转代码图2

iOS 视频剪切、旋转,视频添加音频、添加水印,视频导出_第5张图片

视频旋转代码图3

  1. 拿到视频和音频资源
  2. 创建AVMutableComposition对象
  3. 往AVMutableComposition对象添加视频资源,同时设置视频资源的时间段和插入点
  4. 往AVMutableComposition对象添加音频资源,同时设置音频资源的时间段和插入点
  5. 设置旋转矩阵变换
  6. 创建AVMutableVideoComposition对象
  7. 设置视频的渲染宽高和Frame
  8. 创建视频组合指令AVMutableVideoCompositionInstruction,并设置指令在视频的作用时间范围和旋转矩阵变换
  9. 创建视频组合图层指令AVMutableVideoCompositionLayerInstruction,并设置图层指令在视频的作用时间范围和旋转矩阵变换
  10. 把视频图层指令放到视频指令中,再放入视频组合对象中

这里给出不同旋转角度的案例代码,希望能够对你起帮助,节省你的时间。

     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];
            
        }

视频添加音频

iOS 视频剪切、旋转,视频添加音频、添加水印,视频导出_第6张图片

视频添加音频代码图1

iOS 视频剪切、旋转,视频添加音频、添加水印,视频导出_第7张图片

视频添加音频代码图2

  1. 拿到视频和音频资源
  2. 创建AVMutableComposition对象
  3. 往AVMutableComposition对象添加视频资源,同时设置视频资源的时间段和插入点
  4. 往AVMutableComposition对象添加音频资源,同时设置音频资源的时间段和插入点
  5. 往AVMutableComposition对象添加要追加的音频资源,同时设置音频资源的时间段,插入点和混合模式

视频添加水印

iOS 视频剪切、旋转,视频添加音频、添加水印,视频导出_第8张图片

视频添加水印1

iOS 视频剪切、旋转,视频添加音频、添加水印,视频导出_第9张图片

视频添加水印2

  1. 拿到视频和音频资源
  2. 创建AVMutableComposition对象
  3. 往AVMutableComposition对象添加视频资源,同时设置视频资源的时间段和插入点
  4. 往AVMutableComposition对象添加音频资源,同时设置音频资源的时间段和插入点
  5. 创建视频组合器对象 AVMutableVideoComposition 并设置frame和渲染宽高
  6. 创建视频组合器指令对象,设置指令的作用范围
  7. 创建视频组合器图层指令对象,设置指令的作用范围
  8. 视频组合器图层指令对象 放入 视频组合器指令对象中
  9. 视频组合器指令对象放入视频组合器对象
  10. 创建水印图层Layer并设置frame和水印的位置,并将水印加入视频组合器中

视频导出

iOS 视频剪切、旋转,视频添加音频、添加水印,视频导出_第10张图片

视频导出

  1. 创建输出路径
  2. 根据AVMutableComposition对象创建AVAssetExportSession视频导出对象
  3. 设置AVAssetExportSession的AVMutableVideoComposition对象,AVMutableAudioMix对象,视频导出路径,视频导出格式
  4. 异步导出视频,根据导出结果做对应处理。

http://blog.csdn.net/likendsl/article/details/7595611



作者:要上班的斌哥
链接:https://www.jianshu.com/p/5433143cccd8
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

你可能感兴趣的:(《iOS开发之路》)