【问题标题】:Crop and Export video into circle using swift使用 swift 将视频裁剪并导出为圆形
【发布时间】:2026-01-18 19:55:02
【问题描述】:

我想裁剪“圆圈”中的视频并将其存储。这是我到目前为止所做的。但问题是它只将视频裁剪成矩形。我想把它裁剪成圆形。我该怎么做?

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

}

【问题讨论】:

  • 不清楚你在问什么。您的意思是“如何使 CGAffineTransform 成为圆形而不是矩形?”

标签: ios swift avfoundation avmutablecomposition


【解决方案1】:

假设我上面的问题是正确的,诀窍是使用遮罩和圆形图像而不是使用CGAffineTransform。我怀疑有一种方法可以使用CGAffineTransform,但与此同时......

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

这应该可以满足您的需求。这个here 有一个较旧的教程,请看一半。

【讨论】:

  • 实际上并没有裁剪视频,只是对其进行了屏蔽。
  • 确实如此,但最终结果是一样的,不是吗?还是您希望圆圈外的区域完全“消失”?
  • 是的。我希望它消失。
  • 无论如何都无法实时执行此操作,因此沿着这些思路的任何内容都将像您的示例一样是“离线”转换。而且由于任何电影的最终结果仍然是矩形的,因此最终结果将是相同的。这里的用例到底是什么?