AVPlayerLayer在AVPlayer.replaceCurrentItem(with:)

时间:2019-08-04 17:31:05

标签: ios swift avfoundation avplayer

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

我有适当的代码可以在换下AVPlayerItem之前在当前帧渲染图像,以便在新的AVPlayerItem可以显示帧之前弥合间隙,但是黑色帧正在阻止该图像显示。有什么方法可以控制AVPlayerLayer在显示实际视频数据之前将呈现什么内容?

或者,是否有一种方法可以通知AVPlayerLayer(或AVPlayerItem实际上已经开始显示视频数据了?观察项目状态何时变为.readyToPlay也会触发早期,此时隐藏图像仍使黑框可见。

1 个答案:

答案 0 :(得分:0)

我的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)