2017-04-22 4 views
1

私は間track.naturalSizeため最大値をとるsquareVideoCompositionForAsset()関数から正方形の映像合成スウィフト:スクエア映像合成

func completeWithVideoAtURL(input: NSURL) { 
    let asset = AVAsset(url: input as URL) 
    let output = NSURL(fileURLWithPath: NSHomeDirectory() + "/Documents/Video.mp4") 

    let session = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetMediumQuality)! 
    session.videoComposition = self.squareVideoCompositionForAsset(asset: asset) 
    session.outputURL = output as URL 
    session.outputFileType = AVFileTypeMPEG4 
    session.shouldOptimizeForNetworkUse = true   
    session.exportAsynchronously(completionHandler: {() -> Void in 
     DispatchQueue.main.async(execute: {() -> Void in 
      // do something with the output 
      print("\(output)") 
      PHPhotoLibrary.shared().performChanges({ 
       PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: output as URL) 
      }) { saved, error in 
       if saved { 
        print("saved to gallery") 
       } 
      } 
     }) 
    }) 
} 

func squareVideoCompositionForAsset(asset: AVAsset) -> AVVideoComposition { 
    let track = asset.tracks(withMediaType: AVMediaTypeVideo)[0] 
    let length = max(track.naturalSize.width, track.naturalSize.height) 

    var transform = track.preferredTransform 

    let size = track.naturalSize 
    let scale: CGFloat = (transform.a == -1 && transform.b == 0 && transform.c == 0 && transform.d == -1) ? -1 : 1 // check for inversion 

    transform = transform.translatedBy(x: scale * -(size.width - length)/2, y: scale * -(size.height - length)/2) 

    let transformer = AVMutableVideoCompositionLayerInstruction(assetTrack: track) 
    transformer.setTransform(transform, at: kCMTimeZero) 

    let instruction = AVMutableVideoCompositionInstruction() 
    instruction.timeRange = CMTimeRange(start: kCMTimeZero, duration: kCMTimePositiveInfinity) 
    instruction.layerInstructions = [transformer] 

    let composition = AVMutableVideoComposition() 
    composition.frameDuration = CMTime(value: 1, timescale: 30) 
    composition.renderSize = CGSize(width: length, height: length) 
    composition.instructions = [instruction] 

    return composition 
} 

については、以下のコードを次しています。 width & track.naturalSize.height私はビデオの部分的な部分を切り抜きたくありません。私が最小値をとった場合、肖像画ビデオの場合は、ビデオの上部には、&の部分が切り取られ、ランドスケープビデオの場合は、ビデオの右側に少し左に切り取られます。風景の映像については

  • 、出力は

enter image description here

  • 大丈夫ですが、ポートレート、ビデオのために、出力は次の画像

enter image description here

似見よありますoは左側になります。ビデオを中央に置くことは可能ですか?どんな援助も長い説明のためにすばらしいことと申し訳ありません。代わりに、この行の

答えて

1

LETスケール:CGFloat =(transform.a == -1 & & transform.b == 0 & & transform.c == 0 & & transform.d = = -1)? -1:1

私はちょうどこの

var scale = CGFloat() 
    if (transform.a == 0 && transform.b == 1 && transform.c == -1 && transform.d == 0) { 
     scale = -1 
    } 
    else if (transform.a == 0 && transform.b == -1 && transform.c == 1 && transform.d == 0) { 
     scale = -1 
    } 
    else if (transform.a == 1 && transform.b == 0 && transform.c == 0 && transform.d == 1) { 
     scale = 1 
    } 
    else if (transform.a == -1 && transform.b == 0 && transform.c == 0 && transform.d == -1) { 
     scale = 1 
    } 

を使用し、それが魅力のように共有するための

+0

感謝を働きました! – scaryguy

関連する問題