2017-05-06 53 views
4

我遇到使用AVAssetExportSession僅在前置攝像頭中導出的視頻的錯誤方向。我按照這個教程https://stackoverflow.com/a/35368649/3764365,但我得到了這種情況。我認爲這個形象被削減了一半並不是錯誤的方向。我試圖改變視頻層,渲染層,但沒有運氣。我的代碼看起來像這樣。AVAssetExportSession在前置攝像頭中的錯誤方向

let composition = AVMutableComposition() 
     let vidAsset = AVURLAsset(url: path) 

     // get video track 
     let vtrack = vidAsset.tracks(withMediaType: AVMediaTypeVideo) 
     // get audi trac 

     let videoTrack:AVAssetTrack = vtrack[0] 
     _ = videoTrack.timeRange.duration 
     let vid_timerange = CMTimeRangeMake(kCMTimeZero, vidAsset.duration) 

     var _: NSError? 
     let compositionvideoTrack:AVMutableCompositionTrack = composition.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID()) 

     do { 
      try compositionvideoTrack.insertTimeRange(vid_timerange, of: videoTrack, at: kCMTimeZero) 

     } catch let error { 
      print(error.localizedDescription) 
     } 

     let compositionVideoTrack = composition.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid) 

     let audioTrack = vidAsset.tracks(withMediaType: AVMediaTypeAudio)[0] 

     do { 
      try compositionVideoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, vidAsset.duration), of: audioTrack, at: kCMTimeZero) 

     } catch { 
      print("error") 
     } 

     let size = videoTrack.naturalSize 


     let parentlayer = CALayer() 

     parentlayer.frame = CGRect(x: 0, y: 0, width: size.height, height: size.width) 
     let videolayer = CALayer() 
     videolayer.frame = CGRect(x: 0, y: 0, width: size.height, height: size.width) 
     parentlayer.addSublayer(videolayer) 

let layercomposition = AVMutableVideoComposition() 
     layercomposition.frameDuration = CMTimeMake(1, 30) 
     layercomposition.renderSize = CGSize(width: size.height, height: size.width) 

     layercomposition.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videolayer, in: parentlayer) 

     // instruction for watermark 
     let instruction = AVMutableVideoCompositionInstruction() 
     instruction.timeRange = CMTimeRangeMake(kCMTimeZero, composition.duration) 

     let videotrack = composition.tracks(withMediaType: AVMediaTypeVideo)[0] as AVAssetTrack 
     let layerinstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videotrack) 

     instruction.layerInstructions = [layerinstruction] 
     layercomposition.instructions = [instruction] 

     layerinstruction.setTransform(videoTrack.preferredTransform, at: kCMTimeZero) 

     // create new file to receive data 
     let movieDestinationUrl = UIImage.outPut() 

     // use AVAssetExportSession to export video 
     let assetExport = AVAssetExportSession(asset: composition, presetName: AVAssetExportPreset1280x720)! 
     assetExport.videoComposition = layercomposition 
     assetExport.outputFileType = AVFileTypeQuickTimeMovie 
     assetExport.outputURL = movieDestinationUrl 
+0

你有沒有想過這個? – Markinson

+0

是的,我剛剛在我的代碼上更改了一些數字。哦,下面會試試你的答案。 –

+0

你能分享你的代碼嗎? – Markinson

回答

1

設置movieFileOutputConnection?.isVideoMirrored真正解決了該問題對我來說。在我看來,它是一個奇怪的錯誤。

if self.currentCamera == .front { 
     movieFileOutputConnection?.isVideoMirrored = false 
}