首页 > 解决方案 > AVPlayerLayer 在 AVPlayer.replaceCurrentItem(with:) 上闪烁黑色

问题描述

我有一个AVPlayer用于播放视频的对象。当用户点击一个按钮时,视频会换成另一个视频,然后继续播放。仅使用会导致在显示视频内容的replaceCurrentItem(with:)我的屏幕上出现十分之几秒的黑框。AVPlayerLayer

我有代码可以在换出之前在当前帧处渲染图像AVPlayerItem,以在新的帧准备好显示之前弥合差距AVPlayerItem,但黑框阻止了该图像。有什么方法可以控制在AVPlayerLayer显示实际视频数据之前将呈现的内容?

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

标签: iosswiftavfoundationavplayer

解决方案


我的 macOS 应用程序遇到了同样的闪存问题。AVPlayerLayer我通过每次播放新文件时更新来解决它。

我有一个AVPlayer子类。下面的函数AVPlayerLayer从它的超层中移除并在视图中添加一个新层。

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中,我在播放视频内容之前调用它。

myVideoPlayer.addLayer(view: self.view)

推荐阅读