我有一个用来播放视频的AVPlayer对象。当用户点击按钮时,该视频将被换成另一个视频,该视频将继续播放。仅仅使用replaceCurrentItem(with:)就会导致在我的AVPlayerLayer上显示视频内容的黑色帧只有十分之一秒。
我已经准备好了在AVPlayerItem换出之前在当前帧渲染图像的代码,以便在新的AVPlayerItem有准备显示的帧之前弥合差距,但黑色帧挡住了该图像的视线。在显示实际视频数据之前,有没有办法控制AVPlayerLayer将呈现的内容?
或者,有没有办法通知AVPlayerLayer (或AVPlayerItem实际上已经开始显示视频数据?观察项目的状态何时变为.readyToPlay会过早触发,此时隐藏图像仍会使黑色边框可见。
发布于 2019-08-07 23:44:33
我的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)https://stackoverflow.com/questions/57348799
复制相似问题