概述
視訊處理主要是用到以下這幾個類
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,并設定圖層指令在視訊的作用時間範圍和旋轉矩陣變換
- 把視訊圖層指令放到視訊指令中,再放入視訊組合對象中
這裡給出不同旋轉角度的案例代碼,希望能夠對你起幫助,節省你的時間。
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];
}
視訊添加音頻
視訊添加音頻代碼圖1
視訊添加音頻代碼圖2
- 拿到視訊和音頻資源
- 建立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
如果你覺得本文對你有幫助,請在下方給個 喜歡 ,讓我知道這文章起了它該起的作用!謝謝!
轉載自: http://www.jianshu.com/p/5433143cccd8