iOS 視訊剪下、旋轉,視訊新增音訊、新增水印,視訊匯出
概述
視訊處理主要是用到以下這幾個類
- AVMutableComposition、
- AVMutableVideoComposition、
- AVMutableAudioMix、
- AVMutableVideoCompositionInstruction、
- AVMutableVideoCompositionLayerInstruction、
- AVAssetExportSession
其中 AVMutableComposition 可以用來操作音訊和視訊的組合,AVMutableVideoComposition 可以用來對視訊進行操作,AVMutableAudioMix 類是給視訊新增音訊的,AVMutableVideoCompositionInstruction和AVMutableVideoCompositionLayerInstruction 一般都是配合使用,用來給視訊新增水印或者旋轉視訊方向,AVAssetExportSession 是用來進行視訊匯出操作的。需要值得注意的是當App進入後臺之後,會對使用到GPU的程式碼操作進行限制,會造成崩潰,而視訊處理這些功能多數會使用到GPU,所以需要做對應的防錯處理。
在這裡我會使用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 != 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
- 拿到視訊和音訊資源
- 建立AVMutableComposition物件
- 往AVMutableComposition物件新增視訊資源,同時設定視訊資源的時間段和插入點
- 往AVMutableComposition物件新增音訊資源,同時設定音訊資源的時間段和插入點
- 往AVMutableComposition物件新增要追加的音訊資源,同時設定音訊資源的時間段,插入點和混合模式
視訊新增水印
視訊新增水印1
視訊新增水印2
- 拿到視訊和音訊資源
- 建立AVMutableComposition物件
- 往AVMutableComposition物件新增視訊資源,同時設定視訊資源的時間段和插入點
- 往AVMutableComposition物件新增音訊資源,同時設定音訊資源的時間段和插入點
- 建立視訊組合器物件 AVMutableVideoComposition 並設定frame和渲染寬高
- 建立視訊組合器指令物件,設定指令的作用範圍
- 建立視訊組合器圖層指令物件,設定指令的作用範圍
- 視訊組合器圖層指令物件 放入 視訊組合器指令物件中
- 視訊組合器指令物件放入視訊組合器物件
- 建立水印圖層Layer並設定frame和水印的位置,並將水印加入視訊組合器中
視訊匯出
視訊匯出
- 建立輸出路徑
- 根據AVMutableComposition物件建立AVAssetExportSession視訊匯出物件
- 設定AVAssetExportSession的AVMutableVideoComposition物件,AVMutableAudioMix物件,視訊匯出路徑,視訊匯出格式
- 非同步匯出視訊,根據匯出結果做對應處理。
作者:要上班的斌哥
連結:https://www.jianshu.com/p/5433143cccd8
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。