如何在运行时向视频添加CIFilters

3

我使用AVFoundation录制了一段视频,点击后它会在一个新的视图控制器中开始播放。问题是,我无法给正在播放的视频添加滤镜效果。以下是我所实现的代码。

import UIKit
import AVFoundation

class VideoPlayback: UIViewController {

    let avPlayer = AVPlayer()
    var avPlayerLayer: AVPlayerLayer!

    var videoURL: URL!

    @IBOutlet weak var videoView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(self, selector: #selector(finishVideo), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)

        avPlayerLayer = AVPlayerLayer(player: avPlayer)
        avPlayerLayer.frame = view.bounds
        avPlayerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
        videoView.layer.insertSublayer(avPlayerLayer, at: 0)

        view.layoutIfNeeded()

        let playerItem = AVPlayerItem(url: videoURL as URL)
        avPlayer.replaceCurrentItem(with: playerItem)

        avPlayer.play()

    }

    @objc func finishVideo()
        {
            print("Video Finished")
            self.performSegue(withIdentifier: "unwindToFifteenSeconds", sender: self)
        }

// Remove Observer
    deinit {
        NotificationCenter.default.removeObserver(self)
    }

}

上面的代码只是用AVfoundation播放由相机捕获的视频。我只需要在这个播放的视频上添加CIfilters。
1个回答

7
你可以对视频应用过滤器。
let filter = CIFilter(name: "CIGaussianBlur")!
let asset = AVAsset(url: streamURL)
let item = AVPlayerItem(asset: asset)
item.videoComposition = AVVideoComposition(asset: asset,  applyingCIFiltersWithHandler: { request in

    // Clamp to avoid blurring transparent pixels at the image edges
    let source = request.sourceImage.clampingToExtent()
    filter.setValue(source, forKey: kCIInputImageKey)

    // Vary filter parameters based on video timing
    let seconds = CMTimeGetSeconds(request.compositionTime)
    filter.setValue(seconds * 10.0, forKey: kCIInputRadiusKey)

    // Crop the blurred 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)
})

我不明白,请问您能告诉我在哪里使用这段代码吗?很抱歉问题有点多,因为我是iOS的新手。 - Muneeb Jan
1
好的回答。@Pratap - sparsh
你提供的代码只适用于“CIGaussianBlur”滤镜。如果我想使用另一个CIFilter,我该怎么办?@Pra - Muneeb Jan
你可以更改过滤器名称,这很简单,并且接受答案。 - Pratap
在我的情况下它没有起作用。我的问题可能是什么,导致它在我的情况下无法在块内工作。它从未到达带有“let source = request.sourceImage...”的行。 - Nazar Medeiros
2
注意,这无法与HLS一起使用 :( “视频合成只能与基于文件的媒体一起使用,并且不支持与使用HTTP Live Streaming服务的媒体一起使用。” - Sam Soffes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接