我正在使用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在我更改了一些用于计算过滤器参数的值后重新呈现。如果我更改了值,然后播放或查找,它将正确呈现,但仅当我播放或查找时。有没有办法“就地”触发渲染?
发布于 2017-08-17 13:25:14
据我所知,最好的方法是在暂停的AVVideoComposition上编辑CIFilter输入时,为AVPlayerItem创建一个新的AVPlayer实例。根据我的经验,这比将玩家物品换出再放回玩家要快得多,也更干净。您可能认为创建新的视频合成很慢,但实际上您所做的只是在该特定帧重新定义渲染路径,这几乎与使核心图像缓存中受更改影响的部分无效一样有效。
这里的关键是播放器项目的视频合成必须以某种方式无效以触发重绘。可悲的是,简单地更改核心图像过滤器的输入参数无法(据我所知)使视频合成无效,这是问题的根源。
您可以通过为AVPlayerItem创建一个AVMutableVideoComposition实例并在暂停编辑时以某种方式(通过更改指令、animationTool、frameDuration等内容)对其进行更改,从而获得更高的效率。
发布于 2016-06-11 01:48:37
我使用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];
}发布于 2018-07-23 09:50:33
与this answer类似,但并不是创建一个全新的AVVideoComposition并将其设置为播放器的videoComposition,似乎只需将videoComposition设置为nil,然后立即返回到现有的videoComposition实例,就可以强制刷新当前帧。
当您想要强制刷新当前帧时,这将导致以下简单的解决方法:
let videoComposition = player.currentItem?.videoComposition
player.currentItem?.videoComposition = nil
player.currentItem?.videoComposition = videoCompositionhttps://stackoverflow.com/questions/35208407
复制相似问题