概述
視訊處理主要是用到以下這幾個類
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;
Command設計模式
視訊剪下
- 拿到視訊和音訊資源
- 建立AVMutableComposition物件
- 往AVMutableComposition物件新增視訊資源,同時設定視訊資源的時間段和插入點
- 往AVMutableComposition物件新增音訊資源,同時設定音訊資源的時間段和插入點
視訊旋轉
在查有關視訊旋轉的資料的時候檢視了一篇很不錯的參考資料,在這裡給大家安利一下
http://blog.csdn.net/likendsl/article/details/7595611 講的是矩陣運算的原理,對檢視的矩陣操作的相關內容。
視訊旋轉程式碼圖1
視訊旋轉程式碼圖2
視訊旋轉程式碼圖3
- 拿到視訊和音訊資源
- 建立AVMutableComposition物件
- 往AVMutableComposition物件新增視訊資源,同時設定視訊資源的時間段和插入點
- 往AVMutableComposition物件新增音訊資源,同時設定音訊資源的時間段和插入點
- 設定旋轉矩陣變換
- 建立AVMutableVideoComposition物件
- 設定視訊的渲染寬高和Frame
- 建立視訊組合指令AVMutableVideoCompositionInstruction,並設定指令在視訊的作用時間範圍和旋轉矩陣變換
- 建立視訊組合圖層指令AVMutableVideoCompositionLayerInstruction,並設定圖層指令在視訊的作用時間範圍和旋轉矩陣變換
- 把視訊圖層指令放到視訊指令中,再放入視訊組合物件中
這裡給出不同旋轉角度的案例程式碼,希望能夠對你起幫助,節省你的時間。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
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
- 拿到視訊和音訊資源
- 建立AVMutableComposition物件
- 往AVMutableComposition物件新增視訊資源,同時設定視訊資源的時間段和插入點
- 往AVMutableComposition物件新增音訊資源,同時設定音訊資源的時間段和插入點
- 往AVMutableComposition物件新增要追加的音訊資源,同時設定音訊資源的時間段,插入點和混合模式
視訊新增水印
視訊新增水印1
視訊新增水印2
- 拿到視訊和音訊資源
- 建立AVMutableComposition物件
- 往AVMutableComposition物件新增視訊資源,同時設定視訊資源的時間段和插入點
- 往AVMutableComposition物件新增音訊資源,同時設定音訊資源的時間段和插入點
- 建立視訊組合器物件 AVMutableVideoComposition 並設定frame和渲染寬高
- 建立視訊組合器指令物件,設定指令的作用範圍
- 建立視訊組合器圖層指令物件,設定指令的作用範圍
- 視訊組合器圖層指令物件 放入 視訊組合器指令物件中
- 視訊組合器指令物件放入視訊組合器物件
- 建立水印圖層Layer並設定frame和水印的位置,並將水印加入視訊組合器中
視訊匯出
- 建立輸出路徑
- 根據AVMutableComposition物件建立AVAssetExportSession視訊匯出物件
- 設定AVAssetExportSession的AVMutableVideoComposition物件,AVMutableAudioMix物件,視訊匯出路徑,視訊匯出格式
- 非同步匯出視訊,根據匯出結果做對應處理。
http://blog.csdn.net/likendsl/article/details/7595611