2016-09-21 10 views
1

Я хочу обрезать видео в «круг» и сохранить его. Это то, что я сделал до сих пор. Но проблема заключается только в том, что он обрабатывает видео только в прямоугольнике. Я хочу обрезать его по кругу. Как я могу это сделать?Обрезать и экспортировать видео в круг с помощью 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

Непонятно, что вы просите. Вы имеете в виду «как сделать CGAffineTransform круг вместо прямоугольника?» –

ответ

0

Предполагая, что мой вопрос выше правильно, хитрость заключается в том, чтобы использовать маскировку и круглое изображение вместо использования CGAffineTransform. Я подозреваю, что есть способ сделать это с CGAffineTransform, но в то же время ...

  • сделать изображение с прозрачным кругом в середине
  • импорта, что в ваш проект и загрузить его
  • добавить ваше видео первый слой, а затем изображение маски
  • экспорт

Это должно получить, что вы хотите. На этом here есть несколько более старый учебник, посмотрите примерно на полпути вниз.

+0

На самом деле это не обрезание видео, которое маскирует его. – Developer

+0

Действительно, но конечный результат тот же, нет? Или вы хотите, чтобы область за пределами круга полностью «исчезла»? –

+0

Да. Я хочу, чтобы это исчезло. – Developer

 Смежные вопросы

  • Нет связанных вопросов^_^