如何通过合并前后摄像头的video来解决我的方向问题

我正在合并多个video(植入暂停按钮),当将来自后置摄像头的video与来自前置摄像头的video合并时,一切工作正常,然后其中一个video在新video(合并video)中颠倒过来。 我的代码:

let mixComposition = AVMutableComposition() let videoTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID()) let trackAudio = mixComposition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: CMPersistentTrackID()) var insertTime = kCMTimeZero for var i = 0; i < currentAssets.count; i++ { let tracks = currentAssets[i].tracksWithMediaType(AVMediaTypeVideo) let audios = currentAssets[i].tracksWithMediaType(AVMediaTypeAudio) let assetTrack:AVAssetTrack = tracks[0] as AVAssetTrack try videoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, currentAssets[i].duration), ofTrack: assetTrack, atTime: insertTime) let assetTrackAudio:AVAssetTrack = audios[0] as AVAssetTrack try trackAudio.insertTimeRange(CMTimeRangeMake(kCMTimeZero, currentAssets[i].duration), ofTrack: assetTrackAudio, atTime: insertTime) insertTime = CMTimeAdd(insertTime, currentAssets[i].duration) } videoTrack.preferredTransform = assetTrack.preferredTransform let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,inDomains: .UserDomainMask).last! let mediaURL = documentsURL.URLByAppendingPathComponent(AppMediaFolder) let savePath = mediaURL.URLByAppendingPathComponent("\(NSUUID().UUIDString).mp4").path! self.createDirectoryIfExists(mediaURL) let url = NSURL(fileURLWithPath: savePath) currentAssets.removeAll() currentAssets.append(AVAsset(URL: url)) //Create Exporter let exporter = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality)! exporter.outputURL = url exporter.outputFileType = AVFileTypeMPEG4 exporter.shouldOptimizeForNetworkUse = true 

您需要注意renderSizeAVMutableVideoCompositionAVMutableVideoComposition的转换。

要正确对齐它们,您需要以正确的度数平移旋转video。 要将其颠倒翻转,您需要将其旋转180度并将其转换为正确的坐标:

 ... videoComposition.renderSize = CGSizeMake(X, Y) ... let translate = CGAffineTransformMakeTranslation(X, Y); let rotate = CGAffineTransformRotate(translate, CGFloat(ANGLE_IN_RADIANS)) ... 

在我的例子中, renderSize和平移设置为1280和M_PI度旋转基本上M_PI弧度为单位的M_PI

 let videoComposition = AVMutableVideoComposition() videoComposition.renderSize = CGSizeMake(1280, 720) videoComposition.frameDuration = CMTimeMake(1, 30) let videoInstruction = AVMutableVideoCompositionInstruction() instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(180, 30)) let transformInstruction:AVMutableVideoCompositionLayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: clipVideoTrack) let translate = CGAffineTransformMakeTranslation(1280, 720); let rotate = CGAffineTransformRotate(translate, CGFloat(M_PI)) transformInstruction.setTransform(rotate, atTime: kCMTimeZero) videoInstruction.layerInstructions = [transformInstruction] videoComposition.instructions = [videoInstruction] 

最后,您仍需要将此videoComposition添加到AVAssetExportSession以使转换生效。