我想在视频上应用 CIFilter 并保存该过滤器应用的视频.[出口需要太多时间]



我想在视频上应用 CIFilter 并保存该过滤器应用的视频。

我正在使用AVMutableVideoComposition(也尝试使用AVVideoComposition(对视频应用过滤器,并且它与AVPlayer一起工作正常,但是当我导出过滤后的视频时,在本地保存需要太多时间(20秒视频需要6-8分钟(。请指导我做错了什么...谢谢!

let item = AVPlayerItem(asset: currentAsset!)
    let videoComposition = AVMutableVideoComposition(asset: currentAsset!) { request in
        let filter = CIFilter(name: "CIColorInvert")!
        let source = request.sourceImage.clampedToExtent()
        filter.setValue(source, forKey: kCIInputImageKey)
        let output = filter.outputImage!.cropped(to: request.sourceImage.extent)
        // Provide the filter output to the composition
        request.finish(with: output, context: nil)
    }
    item.videoComposition = videoComposition
    self.player.replaceCurrentItem(with: item)
    let exporter = AVAssetExportSession(asset: item.asset, presetName: AVAssetExportPresetHighestQuality)
    exporter?.videoComposition = videoComposition
    exporter?.outputFileType = .mp4
    let filename = "filename.mp4"
    let documentsDirectory = FileManager.default.urls(for: FileManager.SearchPathDirectory.documentDirectory, in: FileManager.SearchPathDomainMask.userDomainMask).last!
    let outputURL = documentsDirectory.appendingPathComponent(filename)
    exporter?.outputURL = outputURL
    exporter?.exportAsynchronously(completionHandler: {
        guard exporter?.status == .completed else {
            print("export failed: (exporter?.error)")
            return
        }
        print("done: ",outputURL)
    }
    )

您好,请尝试对视频文件应用过滤器

let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let savedoutputURL = documentsDirectory.appendingPathComponent("Filterd.mov")
try? FileManager.default.removeItem(at: savedoutputURL)
let urlVideofile = Bundle.main.url(forResource: "(your video file name)", withExtension: "mov")
let videoAsset = AVAsset(url: urlVideofile!)
let filter = CIFilter(name: "CIColorInvert")!
let composition = AVVideoComposition(asset: asset, applyingCIFiltersWithHandler: { request in
    let source = request.sourceImage.clampingToExtent()
    filter.setValue(source, forKey: kCIInputImageKey)
    // Crop the invert output to the bounds of the original image
    let output = filter.outputImage!.cropping(to: request.sourceImage.extent)
    // Provide the filter output to the composition
    request.finish(with: output, context: nil)
})
// Simultaneous Video playing although you can use as your's
let playerItem = AVPlayerItem(asset: videoAsset)
playerItem.videoComposition = composition
self.player = AVPlayer(playerItem: playerItem)
self.player.volume = 0.0
self.playerController.player = self.player
 present(self.playerController, animated: true, completion: {
      self.player.play()
})

保存视频

let export = AVAssetExportSession(asset: videoAsset, presetName: AVAssetExportPresetHighestQuality)
    export!.outputFileType = AVFileType.mov
    export!.outputURL = savedoutputURL
    export!.videoComposition = composition
    export?.exportAsynchronously(completionHandler: {
        if export!.status.rawValue == 4 {
            print("Export failed -> Reason: (export?.error!.localizedDescription))")
            print(export?.error!)
            return
        }
        print("done: ",savedoutputURL)
    })

它是 100% 测试的代码在 26 秒视频上应用过滤器大约在 10 到 15 秒内

:)享受

最新更新