首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVPlayer.replaceCurrentItem上的AVPlayerLayer呈黑色闪烁(带有:)

问AVPlayer.replaceCurrentItem上的AVPlayerLayer呈黑色闪烁(带有:)
EN

Stack Overflow用户
提问于 2019-08-05 01:31:05
回答 1查看 964关注 0票数 1

我有一个用来播放视频的AVPlayer对象。当用户点击按钮时,该视频将被换成另一个视频,该视频将继续播放。仅仅使用replaceCurrentItem(with:)就会导致在我的AVPlayerLayer上显示视频内容的黑色帧只有十分之一秒。

我已经准备好了在AVPlayerItem换出之前在当前帧渲染图像的代码,以便在新的AVPlayerItem有准备显示的帧之前弥合差距,但黑色帧挡住了该图像的视线。在显示实际视频数据之前,有没有办法控制AVPlayerLayer将呈现的内容?

或者,有没有办法通知AVPlayerLayer (或AVPlayerItem实际上已经开始显示视频数据?观察项目的状态何时变为.readyToPlay会过早触发,此时隐藏图像仍会使黑色边框可见。

EN

回答 1

Stack Overflow用户

发布于 2019-08-07 23:44:33

我的macOS应用程序也有同样的闪存问题。我通过在每次播放新文件时更新AVPlayerLayer来解决这个问题。

我有一个AVPlayer子类。下面的函数将AVPlayerLayer从其超级层移除,并向视图中添加一个新层。

代码语言:javascript
复制
class MyVideoPlayer: AVPlayer {

    func addLayer(view: NSView) {
        view.layer!.sublayers?
            .filter { $0 is AVPlayerLayer }
            .forEach { $0.removeFromSuperlayer() }
        let layer = AVPlayerLayer.init(player: self)
        layer.videoGravity = AVLayerVideoGravity.resize
        layer.frame = view.bounds
        view.layer!.addSublayer(layer)
    }

}

在我的ViewController中,我会在播放视频内容之前调用它。

代码语言:javascript
复制
myVideoPlayer.addLayer(view: self.view)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57348799

复制
相关文章

相似问题

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