微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – 如何在AVVideoComposition的applyCIFiltersWithHandler中触发重绘过滤器?

我正在使用 Swift在视图的AVPlayerLayer中显示来自AVPlayer的内容.关联的AVPlayerItem有一个videoComposition,并且用于创建它的代码的略微简化版本(没有错误检查等)如下所示:
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重新渲染.如果我更改值然后播放或搜索,则会正确呈现,但仅限于我玩或寻找.有没有办法触发“就地”渲染?

解决方法

我用hack来完全替换avPlayerItem以强制刷新.但是,如果有一种方法可以触发avPlayerItem直接重新渲染,那会好得多.
// 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];
}

原文地址:https://www.jb51.cc/iOS/328514.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐