使用swift将视频裁剪并导出到圆圈中

时间:2016-09-21 20:06:23

标签: ios swift avfoundation avmutablecomposition

我想以“圈子”裁剪视频并存储它。这就是我到目前为止所做的。但问题是它只能以矩形方式裁剪视频。我想把它裁剪成圆圈。我怎么能这样做?

    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)")

}

1 个答案:

答案 0 :(得分:0)

假设我的上述问题是正确的,诀窍是使用遮罩和圆形图像而不是使用CGAffineTransform。我怀疑有一种方法可以用CGAffineTransform来做,但在此期间...

  • 在中间制作一个带透明圆圈的图像
  • 将其导入您的项目并加载它
  • 首先添加视频图层,然后添加蒙版图像
  • 出口

那应该能得到你想要的东西。 <{3}}有一个较旧的教程,看起来有一半了。

相关问题