カメラロールの動画に対してCIFilterを適用し,保存する方法.

カメラロールから動画を選択

ViewController.swift
let pickerController = UIImagePickerController()
pickerController.sourceType = .photoLibrary
pickerController.mediaTypes = ["public.movie"]
pickerController.delegate = self

present(pickerController, animated: true)

動画を選択する際は,UIImagePickerControllerを用います.
UIImagePickerController.mediaTypesを["public.movie"]にすることで,動画のみを表示・選択することができます.

読み込んだ動画のフレームごとにCIFilterで処理をする

ViewController.swift
let filter = CIFilter(name: "Filter Name")!
filter.setDefaults()

let videoComposition = AVVideoComposition(asset: asset) { request in
    let source = request.sourceImage.clampedToExtent()

    filter.setValue(source, forKey: kCIInputImageKey)

    let output = filter.outputImage!.cropped(to: request.sourceImage.extent)

    request.finish(with: output, context: nil)
}

ここは,公式のリファレンスを参照しました.

動画を保存する

ViewController.swift
guard let exportSession = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetHighestQuality) else {
    fatalError()
}

exportSession.outputURL = tmpURL
exportSession.outputFileType = .mp4
exportSession.videoComposition = videoComposition

exportSession.exportAsynchronously {
    UISaveVideoAtPathToSavedPhotosAlbum(tmpURL.path, nil, nil, nil)
}

AVAssetExportSessionを使って動画を書き出します.

ソースコード


  • 環境
    • Xcode version- 9.2
    • Swift version- 4.0
    • iOS version- 11.2.2
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.