首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我想应用CIFilter在视频和保存过滤器应用视频。[出口时间过长]

我想应用CIFilter在视频和保存过滤器应用视频。[出口时间过长]
EN

Stack Overflow用户
提问于 2019-02-12 14:44:17
回答 1查看 1.2K关注 0票数 1

我想在视频上应用CIFilter,并保存应用于视频的过滤器.

我使用AVMutableVideoComposition (也尝试了AVVideoComposition)在视频上应用过滤器,并且它在AVPlayer中运行得很好,但是当我导出过滤过的视频时,需要花费太多的时间在本地保存(20秒的视频拍摄6-8分钟)。请告诉我我做错了什么..。谢谢你!

代码语言:javascript
复制
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)
    }
    )
EN

回答 1

Stack Overflow用户

发布于 2020-04-20 07:38:01

你好,尝试在视频文件上应用过滤器

代码语言:javascript
复制
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()
})

保存视频

代码语言:javascript
复制
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秒的

*享受

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54652637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档