2017-09-22 4 views
0

J'essayais de fusionner un son et une vidéo. Tout est complètement parfait. Mais la vidéo s'exporte en mode paysage. Mais je le veux en mode portrait.Le mode portrait d'orientation vidéo ne fonctionne pas

Je sais que cette question a déjà été répondue dans StackOverflow. Mais ces réponses sont ne fonctionne pas pour moi. Est-ce que quelqu'un peut m'aider s'il vous plait. J'en ai besoin rapidement 3 version.

C'est la liste de réponse que j'ai suivi, mais ne fonctionne pas pour moi

First

second

3rd

4th

5th

6th

Note: S'il vous plaît ne pas voter ce double. Je sais que cette question a déjà mais pas la bonne réponse pour moi. aidez-moi s'il vous plaît. Je suis coincé ici pour une longue journée.

ici ce que j'essaie de mettre en œuvre

let aVideoAsset : AVAsset = AVAsset(url: videoUrl as URL) 
     let aAudioAsset : AVAsset = AVAsset(url: audioUrl as URL) 

     let mainComposition = AVMutableComposition() 

     let videoTrack = mainComposition.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid) 
     let videoAssetTrack = aVideoAsset.tracks(withMediaType: AVMediaTypeVideo).first! 
     try? videoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, aVideoAsset.duration), of: videoAssetTrack, at: kCMTimeZero) 

     let audioTrack = mainComposition.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid) 
     let audioAssetTrack = aAudioAsset.tracks(withMediaType: AVMediaTypeAudio).first! 
     try? audioTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, aAudioAsset.duration), of: audioAssetTrack, at: kCMTimeZero) 

     let videoCompositionLayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack) 
     videoCompositionLayerInstruction.setTransform(videoAssetTrack.preferredTransform, at: kCMTimeZero) 
     let videoCompositionInstuction = AVMutableVideoCompositionInstruction() 
     videoCompositionInstuction.timeRange = CMTimeRangeMake(kCMTimeZero, mainComposition.duration) 
     videoCompositionInstuction.layerInstructions = [ videoCompositionLayerInstruction ] 



     var renderSize = videoAssetTrack.naturalSize 
     renderSize = renderSize.applying(videoAssetTrack.preferredTransform) 
     renderSize = CGSize(width: fabs(renderSize.width), height: fabs(renderSize.height)) 

     let videoComposition = AVMutableVideoComposition() 
     videoComposition.renderSize = renderSize 
     videoComposition.renderSize = CGSize(width: 1280, height: 720) 
     videoComposition.frameDuration = CMTimeMake(1, 30) 
     videoComposition.instructions = [ videoCompositionInstuction ] 




     let savePathUrl : NSURL = NSURL(fileURLWithPath: NSHomeDirectory() + "/Documents/newVideo.mp4") 

     let assetExport = AVAssetExportSession(asset: mainComposition, presetName: AVAssetExportPresetHighestQuality) 
     assetExport?.outputURL = savePathUrl as URL 
     assetExport?.outputFileType = AVFileTypeQuickTimeMovie 
     assetExport?.shouldOptimizeForNetworkUse = true 
     assetExport?.exportAsynchronously {() -> Void in 
      switch assetExport?.status { 

      case AVAssetExportSessionStatus.completed?: 

       //Uncomment this if u want to store your video in asset 

       let assetsLib = ALAssetsLibrary() 
       assetsLib.writeVideoAtPath(toSavedPhotosAlbum: savePathUrl as URL!, completionBlock: nil) 

       print("success") 
      case AVAssetExportSessionStatus.failed?: 
       print("failed \(String(describing: assetExport?.error))") 
      case AVAssetExportSessionStatus.cancelled?: 
       print("cancelled \(String(describing: assetExport?.error))") 
      default: 
       print("complete") 
      } 
     } 

Répondre

0

il suffit de retirer la ligne suivante à partir de votre code.

videoComposition.renderSize = CGSize(width: 1280, height: 720) 
+0

juste enlever. encore ça ne marche pas .. –

+0

C'est intéressant. Cela fonctionne comme prévu après avoir supprimé cette ligne de ma part. –