2016-09-21 2 views
1

Ich möchte ein Video in "Kreis" beschneiden und speichern. Das habe ich bisher gemacht. Aber das Problem ist, es schneidet nur das Video im Rechteck. Ich möchte es im Kreis zuschneiden. Wie kann ich das machen?Crop und Export Video in Kreis mit swift

func cropVideo() { 

    let asset = AVAsset.init(url: URL(fileURLWithPath: Bundle.main.path(forResource: "1", ofType: "mp4")!)) 
    let clipVideoTrack = asset.tracks(withMediaType: AVMediaTypeVideo)[0] 
    let videoComposition = AVMutableVideoComposition() 
    videoComposition.frameDuration = CMTimeMake(1, 30) 
    videoComposition.renderSize = CGSize(width: clipVideoTrack.naturalSize.height, height: clipVideoTrack.naturalSize.height) 
    let instruction = AVMutableVideoCompositionInstruction() 
    instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30)) 
    let transformer = AVMutableVideoCompositionLayerInstruction.init(assetTrack: clipVideoTrack) 
    let t1 = CGAffineTransform(translationX: clipVideoTrack.naturalSize.height, y: 0) 
    let t2 = t1.rotated(by: CGFloat(M_PI_2)) 
    let finalTransform = t2 
    transformer.setTransform(finalTransform, at: kCMTimeZero) 
    instruction.layerInstructions = [transformer] 
    videoComposition.instructions = [instruction] 


    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] 
    let exportPath = documentsPath.appendingFormat("/CroppedVideo.mp4") 
    let exportUrl = URL(fileURLWithPath: exportPath) 
    print("export url = \(exportUrl)") 


    do { 
     try FileManager.default.removeItem(at: exportUrl) 
    } 
    catch _ { 
    } 

    exporter = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetHighestQuality) 
    exporter.videoComposition = videoComposition 
    exporter.outputURL = exportUrl 
    exporter.outputFileType = AVFileTypeQuickTimeMovie 
    exporter.exportAsynchronously(completionHandler: {() -> Void in 
     DispatchQueue.main.async(execute: {() -> Void in 
      self.exportDidFinish(self.exporter) 
     }) 
    }) 
} 

func exportDidFinish(_ session: AVAssetExportSession) { 
    let outputURL = session.outputURL 
    print("outputurl = \(outputURL)") 

} 
+0

Es ist nicht klar, was Sie fragen. Meinst du "wie mache ich die CGAffineTransform einen Kreis statt eines Rechtecks?" –

Antwort

0

Unter der Annahme, meine Frage oben richtig ist, ist der Trick, Maskierung zu verwenden und ein rundes Bild, anstatt die CGAffineTransform zu verwenden. Ich vermute, es ist eine Möglichkeit, es mit CGAffineTransform zu tun, aber in der Zwischenzeit ...

  • ein Bild mit einem transparenten Kreis in der Mitte
  • Import machen, die in Ihr Projekt und laden Sie es
  • add zuerst Ihre Videoschicht, und dann das Maskenbild
  • Export

das sollten Sie bekommen, was Sie wollen. Es gibt ein etwas älteres Tutorial zu dieser here, schauen Sie sich etwa auf halbem Weg nach unten.

+0

Es schneidet das Video nicht wirklich ab, sondern maskiert es nur. – Developer

+0

In der Tat, aber das Endergebnis ist das gleiche, nein? Oder möchten Sie, dass der Bereich außerhalb des Kreises vollständig "verschwindet"? –

+0

Ja. Ich will das verschwinden. – Developer