天天看點

iOS 視訊剪切、旋轉,視訊添加音頻、添加水印,視訊導出

概述

視訊處理主要是用到以下這幾個類

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;
           
iOS 視訊剪切、旋轉,視訊添加音頻、添加水印,視訊導出

Command設計模式

視訊剪切

iOS 視訊剪切、旋轉,視訊添加音頻、添加水印,視訊導出

視訊頭部剪切代碼圖

  1. 拿到視訊和音頻資源
  2. 建立AVMutableComposition對象
  3. 往AVMutableComposition對象添加視訊資源,同時設定視訊資源的時間段和插入點
  4. 往AVMutableComposition對象添加音頻資源,同時設定音頻資源的時間段和插入點

視訊旋轉

在查有關視訊旋轉的資料的時候檢視了一篇很不錯的參考資料,在這裡給大家安利一下

http://blog.csdn.net/likendsl/article/details/7595611 講的是矩陣運算的原理,對視圖的矩陣操作的相關内容。

iOS 視訊剪切、旋轉,視訊添加音頻、添加水印,視訊導出

視訊旋轉代碼圖1

iOS 視訊剪切、旋轉,視訊添加音頻、添加水印,視訊導出

視訊旋轉代碼圖2

iOS 視訊剪切、旋轉,視訊添加音頻、添加水印,視訊導出

視訊旋轉代碼圖3

  1. 拿到視訊和音頻資源
  2. 建立AVMutableComposition對象
  3. 往AVMutableComposition對象添加視訊資源,同時設定視訊資源的時間段和插入點
  4. 往AVMutableComposition對象添加音頻資源,同時設定音頻資源的時間段和插入點
  5. 設定旋轉矩陣變換
  6. 建立AVMutableVideoComposition對象
  7. 設定視訊的渲染寬高和Frame
  8. 建立視訊組合指令AVMutableVideoCompositionInstruction,并設定指令在視訊的作用時間範圍和旋轉矩陣變換
  9. 建立視訊組合圖層指令AVMutableVideoCompositionLayerInstruction,并設定圖層指令在視訊的作用時間範圍和旋轉矩陣變換
  10. 把視訊圖層指令放到視訊指令中,再放入視訊組合對象中

這裡給出不同旋轉角度的案例代碼,希望能夠對你起幫助,節省你的時間。

CGAffineTransform translateToCenter;
        if (self.degrees != ) {
            CGAffineTransform mixedTransform;
            if(self.degrees == ){
                //順時針旋轉90°
                NSLog(@"視訊旋轉90度,home按鍵在左");
                translateToCenter = CGAffineTransformMakeTranslation(mixedVideoTrack.naturalSize.height,);
                mixedTransform = CGAffineTransformRotate(translateToCenter,M_PI_2);
                waterMarkVideoComposition.renderSize = CGSizeMake(mixedVideoTrack.naturalSize.height,mixedVideoTrack.naturalSize.width);
            }else if(self.degrees == ){
                //順時針旋轉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°
                NSLog(@"視訊旋轉270度,home按鍵在右");
                translateToCenter = CGAffineTransformMakeTranslation(, assetVideoTrack.naturalSize.width);
                mixedTransform = CGAffineTransformRotate(translateToCenter,M_PI_2*);
                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 視訊剪切、旋轉,視訊添加音頻、添加水印,視訊導出

視訊添加音頻代碼圖1

iOS 視訊剪切、旋轉,視訊添加音頻、添加水印,視訊導出

視訊添加音頻代碼圖2

  1. 拿到視訊和音頻資源
  2. 建立AVMutableComposition對象
  3. 往AVMutableComposition對象添加視訊資源,同時設定視訊資源的時間段和插入點
  4. 往AVMutableComposition對象添加音頻資源,同時設定音頻資源的時間段和插入點
  5. 往AVMutableComposition對象添加要追加的音頻資源,同時設定音頻資源的時間段,插入點和混合模式

視訊添加水印

iOS 視訊剪切、旋轉,視訊添加音頻、添加水印,視訊導出

視訊添加水印1

iOS 視訊剪切、旋轉,視訊添加音頻、添加水印,視訊導出

視訊添加水印2

  1. 拿到視訊和音頻資源
  2. 建立AVMutableComposition對象
  3. 往AVMutableComposition對象添加視訊資源,同時設定視訊資源的時間段和插入點
  4. 往AVMutableComposition對象添加音頻資源,同時設定音頻資源的時間段和插入點
  5. 建立視訊組合器對象 AVMutableVideoComposition 并設定frame和渲染寬高
  6. 建立視訊組合器指令對象,設定指令的作用範圍
  7. 建立視訊組合器圖層指令對象,設定指令的作用範圍
  8. 視訊組合器圖層指令對象 放入 視訊組合器指令對象中
  9. 視訊組合器指令對象放入視訊組合器對象
  10. 建立水印圖層Layer并設定frame和水印的位置,并将水印加入視訊組合器中

視訊導出

iOS 視訊剪切、旋轉,視訊添加音頻、添加水印,視訊導出

視訊導出

  1. 建立輸出路徑
  2. 根據AVMutableComposition對象建立AVAssetExportSession視訊導出對象
  3. 設定AVAssetExportSession的AVMutableVideoComposition對象,AVMutableAudioMix對象,視訊導出路徑,視訊導出格式
  4. 異步導出視訊,根據導出結果做對應處理。
http://blog.csdn.net/likendsl/article/details/7595611

如果你覺得本文對你有幫助,請在下方給個 喜歡 ,讓我知道這文章起了它該起的作用!謝謝!

轉載自: http://www.jianshu.com/p/5433143cccd8

繼續閱讀