【问题标题】:how to add CIFilters to a video at runtime如何在运行时将 CIFilters 添加到视频中
【发布时间】:2019-05-28 22:16:08
【问题描述】:

我使用 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。

【问题讨论】:

    标签: swift video filter avfoundation cifilter


    【解决方案1】:

    您可以对视频应用过滤器

    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新手。
    • 好答案。 @Pratap
    • 您提供的代码仅适用于“CIGaussianBlur”过滤器。如果我想使用另一个 CIFilter,我该怎么办? @普拉
    • 您可以更改过滤器名称,这很简单并接受答案
    • 就我而言,它不起作用。我的问题不在我的案子范围内,这可能是什么问题。它永远不会到达 ``let source = request.sourceImage...
    猜你喜欢
    • 2020-02-16
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2012-05-06
    相关资源
    最近更新 更多