将CIFilters切换到视频

斯特凡诺(Stefano Vet)

有人可以帮助我了解在不重新启动视频播放器的情况下切换CIFilter的正确方法吗?

我在视图中播放本地视频。如果在集合视图中点击一个单元格,视频将更改CIFilter。

我的代码

let filter = CIFilter(name: "CIPhotoEffectNoir")!
let asset = AVAsset(url: fooURL)
let item = AVPlayerItem(asset: asset)
item.videoComposition = AVVideoComposition(asset: asset,  applyingCIFiltersWithHandler: { request in
    let source = request.sourceImage.clampedToExtent()
    filter.setValue(source, forKey: kCIInputImageKey)

    let output = filter.outputImage

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

player = AVPlayer(playerItem: item)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = videoViewDetail.bounds
videoViewDetail.layer.addSublayer(playerLayer)
player?.play()

代码效果很好,效果正确

但是我有很多CIFilters的collectionview。点击一个单元格,我找不到切换与视频关联的过滤器的方法。如果我使用新的过滤器重新创建新的播放器,并将其添加为当前“ addsublayer”的替代者,则播放器将重新启动视频。

@IBAction func tap(_ sender: UITapGestureRecognizer) {

    let location = sender.location(in: self.collectionView)
    let indexPath = self.collectionView.indexPathForItem(at: location)

    if let index = indexPath {
        // code to switch to another CIFilter like for example "CISepiaTone"
    }
}

在不重新启动视频的情况下将CIFilter更改为正在播放的视频的最佳方法是什么?是否可以使用新的过滤器保存视频?

谢谢!

弗兰克·施莱格尔

创建AVVideoComposition播放器时提供的处理程序块会针对播放器显示的每个视频帧连续调用。这意味着您只需要切换该块内部使用的过滤器。

最简单的方法是从块外部引用过滤器,而不是捕获它。然后,您可以在运行时更改引用。

例如,假设您的代码在某个视图控制器方法中运行,则可以执行以下操作:

class MyViewController: UIViewController {

    var filter: CIFilter = CIFilter(name: "CIPhotoEffectNoir")!

    func createPlayer() {
        let asset = AVAsset(url: fooURL)
        let item = AVPlayerItem(asset: asset)
        item.videoComposition = AVVideoComposition(asset: asset,  applyingCIFiltersWithHandler: { [weak self] request in
            guard let self = self else {
                request.finish(with error: SomeError)
                return
            }
            let source = request.sourceImage.clampedToExtent()
            self.filter.setValue(source, forKey: kCIInputImageKey)

            let output = self.filter.outputImage

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

        player = AVPlayer(playerItem: item)
        let playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = videoViewDetail.bounds
        videoViewDetail.layer.addSublayer(playerLayer)
        player?.play()
    }

    // ...

}

然后,您只需更改即可轻松更改过滤器self.filter

(不过,您可能希望同步对过滤器的访问,以避免并发问题。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何通过将手机切换为横向模式而不影响流视频来切换到全屏

来自分类Dev

将嵌入式vimeo切换到嵌入式youtube视频

来自分类Dev

将列值切换到左侧

来自分类Dev

将数据从数组切换到向量

来自分类Dev

将 Joomla 切换到 Wordpress

来自分类Dev

Android Ionic 视频切换到全屏闪烁

来自分类Dev

切换到Ubuntu

来自分类Dev

将交换链切换到窗口模式

来自分类Dev

如何将嵌套列表切换到数组

来自分类Dev

调试后自动将XCode切换到Project Navigator

来自分类Dev

使用Segues将UINavigationViewController切换到UITabBarController

来自分类Dev

将灯光切换到N的算法是什么?

来自分类Dev

如何将显示从无切换到表格单元?

来自分类Dev

用户输入后将perl进程切换到后台

来自分类Dev

Rails-自动将环境切换到生产

来自分类Dev

JavaScript:将CSS切换到暗模式

来自分类Dev

WiX-将InstallScope从perUser切换到perMachine

来自分类Dev

Swift-如何将ViewController切换到TabBarController

来自分类Dev

将Heroku从php切换到Node js

来自分类Dev

Atom:请勿将标签页切换到最新

来自分类Dev

将声音切换到其他监视器

来自分类Dev

将片段从稳定屏幕切换到全屏的正确方法?

来自分类Dev

将开始屏幕切换到Pygame中的游戏

来自分类Dev

如何将If / Else切换到For循环?

来自分类Dev

将类切换到父组件-React

来自分类Dev

将大型网站从MySQL切换到MySQLi

来自分类Dev

将声音切换到其他监视器

来自分类Dev

如何将Arch Linux切换到LTS内核?

来自分类Dev

jQuery单击时将文本切换到输入字段