我有一个AVPlayer
对象,我正在用来播放视频。当用户点击按钮时,视频将换成其他视频,然后继续播放。仅使用replaceCurrentItem(with:)
会导致正在显示视频内容的AVPlayerLayer
上出现黑框的十分之几秒。
我有适当的代码可以在换下AVPlayerItem
之前在当前帧渲染图像,以便在新的AVPlayerItem
可以显示帧之前弥合间隙,但是黑色帧正在阻止该图像显示。有什么方法可以控制AVPlayerLayer
在显示实际视频数据之前将呈现什么内容?
或者,是否有一种方法可以通知AVPlayerLayer
(或AVPlayerItem
实际上已经开始显示视频数据了?观察项目状态何时变为.readyToPlay
也会触发早期,此时隐藏图像仍使黑框可见。
答案 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)