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

項目中用到視頻剪切,在網上看到一篇比較全面的博文,Mark一下我們共同學習。感謝原文地址:
http://ios.jobbole.com/85309/

概述

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

  • AVMutableComposition
  • AVMutableVideoComposition
  • AVMutableAudioMix
  • AVMutableVideoCompositionInstruction
  • AVMutableVideoCompositionLayerInstruction

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章