1. 程式人生 > >iOS 視訊剪下、旋轉,視訊新增音訊、新增水印,視訊匯出

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;

Command設計模式

視訊剪下

視訊頭部剪下程式碼圖

  1. 拿到視訊和音訊資源
  2. 建立AVMutableComposition物件
  3. 往AVMutableComposition物件新增視訊資源,同時設定視訊資源的時間段和插入點
  4. 往AVMutableComposition物件新增音訊資源,同時設定音訊資源的時間段和插入點

視訊旋轉

在查有關視訊旋轉的資料的時候查看了一篇很不錯的參考資料,在這裡給大家安利一下
http://blog.csdn.net/likendsl/article/details/7595611 講的是矩陣運算的原理,對檢視的矩陣操作的相關內容。

視訊旋轉程式碼圖1

視訊旋轉程式碼圖2

視訊旋轉程式碼圖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];
            
        }

視訊新增音訊

視訊新增音訊程式碼圖1

視訊新增音訊程式碼圖2

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

視訊新增水印

視訊新增水印1

視訊新增水印2

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

視訊匯出

視訊匯出

  1. 建立輸出路徑
  2. 根據AVMutableComposition物件建立AVAssetExportSession視訊匯出物件
  3. 設定AVAssetExportSession的AVMutableVideoComposition物件,AVMutableAudioMix物件,視訊匯出路徑,視訊匯出格式
  4. 非同步匯出視訊,根據匯出結果做對應處理。

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



作者:要上班的斌哥
連結:https://www.jianshu.com/p/5433143cccd8
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。