首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在AVVideoComposition的applyingCIFiltersWithHandler中触发滤镜的重绘?

如何在AVVideoComposition的applyingCIFiltersWithHandler中触发滤镜的重绘?
EN

Stack Overflow用户
提问于 2016-02-05 02:08:00
回答 5查看 1.6K关注 0票数 8

我正在使用Swift在视图的AVPlayerLayer中显示来自AVPlayer的内容。关联的AVPlayerItem有一个videoComposition,并略微简化了创建它的代码版本(没有错误检查等)看起来像这样:

代码语言:javascript
复制
playerItem.videoComposition = AVVideoComposition(asset: someAsset, applyingCIFiltersWithHandler: {
                [unowned self] (request: AVAsynchronousCIImageFilteringRequest) in

    let paramDict = << set up parameter dictionary based on class vars >>

    // filter the image
    let filter = self.ciFilterWithParamDict(paramDict) {
    filter.setValue(request.sourceImage, forKey: kCIInputImageKey)
    if let filteredImage = filter.outputImage {
        request.finishWithImage(filteredImage, context: nil)
    }
})

当AVPlayer正在播放或查找时,这一切都会按预期工作。如果创建并加载了新的videoComposition,则会正确呈现该AVPlayerLayer。

然而,我还没有找到一种方法来“触发”AVPlayer/ AVPlayerItem/ AVVideoComposition在我更改了一些用于计算过滤器参数的值后重新呈现。如果我更改了值,然后播放或查找,它将正确呈现,但仅当我播放或查找时。有没有办法“就地”触发渲染?

EN

回答 5

Stack Overflow用户

发布于 2017-08-17 13:25:14

据我所知,最好的方法是在暂停的AVVideoComposition上编辑CIFilter输入时,为AVPlayerItem创建一个新的AVPlayer实例。根据我的经验,这比将玩家物品换出再放回玩家要快得多,也更干净。您可能认为创建新的视频合成很慢,但实际上您所做的只是在该特定帧重新定义渲染路径,这几乎与使核心图像缓存中受更改影响的部分无效一样有效。

这里的关键是播放器项目的视频合成必须以某种方式无效以触发重绘。可悲的是,简单地更改核心图像过滤器的输入参数无法(据我所知)使视频合成无效,这是问题的根源。

您可以通过为AVPlayerItem创建一个AVMutableVideoComposition实例并在暂停编辑时以某种方式(通过更改指令、animationTool、frameDuration等内容)对其进行更改,从而获得更高的效率。

票数 6
EN

Stack Overflow用户

发布于 2016-06-11 01:48:37

我使用hack完全替换了avPlayerItem,以强制刷新。但是,如果有一种方法可以触发avPlayerItem直接重新渲染,那就更好了。

代码语言:javascript
复制
// If the video is paused, force the player to re-render the frame.
if (self.avPlayer.currentItem.asset && self.avPlayer.rate == 0) {
    CMTime currentTime = self.avPlayerItem.currentTime;

    [self.avPlayer replaceCurrentItemWithPlayerItem:nil];
    [self.avPlayer replaceCurrentItemWithPlayerItem:self.avPlayerItem];
    [self.avPlayerItem seekToTime:currentTime toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
}
票数 4
EN

Stack Overflow用户

发布于 2018-07-23 09:50:33

this answer类似,但并不是创建一个全新的AVVideoComposition并将其设置为播放器的videoComposition,似乎只需将videoComposition设置为nil,然后立即返回到现有的videoComposition实例,就可以强制刷新当前帧。

当您想要强制刷新当前帧时,这将导致以下简单的解决方法:

代码语言:javascript
复制
let videoComposition = player.currentItem?.videoComposition
player.currentItem?.videoComposition = nil
player.currentItem?.videoComposition = videoComposition
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35208407

复制
相关文章

相似问题

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