2017-05-06 6 views
4

Ich bin Begegnung mit falscher Ausrichtung von Video nur vor der Kamera mit AVAssetExportSession exportierte. Ich folgte diesem Tutorial https://stackoverflow.com/a/35368649/3764365, aber ich habe dieses Szenario. Ich denke, es ist keine falsche Ausrichtung, das Bild wird halbiert. Ich habe versucht, die Video-Ebene zu ändern, Render-Ebene, aber kein Glück. Mein Code sieht so aus.AVAssetExportSession falsche Orientierung vor der Kamera

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

Haben Sie das jemals herausgefunden? – Markinson

+0

yup, ich habe gerade einige Zahlen in meinem Code geändert. Ohhh, werde deine Antwort unten versuchen. –

+0

können Sie Ihren Code teilen? – Markinson

Antwort

1

Einstellung movieFileOutputConnection? .isVideoMirrored von wahr zu falsch für mich das Problem behoben. Es ist meiner Meinung nach ein komischer Fehler.

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