ios - AVPlayerLayer 在 AVPlayer.replaceCurrentItem(with:) 上闪烁黑色
问题描述
我有一个AVPlayer
用于播放视频的对象。当用户点击一个按钮时,视频会换成另一个视频,然后继续播放。仅使用会导致在显示视频内容的replaceCurrentItem(with:)
我的屏幕上出现十分之几秒的黑框。AVPlayerLayer
我有代码可以在换出之前在当前帧处渲染图像AVPlayerItem
,以在新的帧准备好显示之前弥合差距AVPlayerItem
,但黑框阻止了该图像。有什么方法可以控制在AVPlayerLayer
显示实际视频数据之前将呈现的内容?
或者,有没有办法通知AVPlayerLayer
(或AVPlayerItem
实际上已经开始显示视频数据?观察项目的状态何时变得.readyToPlay
过早触发,在该点隐藏图像仍然使黑框可见。
解决方案
我的 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)
推荐阅读
- ffmpeg - 为输出流 #1:2 打开编码器时出错 - 可能是不正确的参数,例如 bit_rate、rate、width 或 height
- angular - 在 Angular 中测试 utils 文件。最佳实践是什么?
- javascript - 异步函数的回调函数是否推送到条件递归同步函数中的调用堆栈?
- mysql - 在 MySQL 中替换字符串中的第一个字符
- php - 使用外部 API 进行 Laravel 身份验证
- security - 使用我的连接字符串连接到本地数据库时遇到问题
- swift - Swift - 按日期对从 tableviewSections 中的 db 接收到的对象进行排序
- powerbi - Dax 措施以避免除 Power BI 中的一个之外的所有切片器
- swift - 从类继承协议?
- oracle - Oracle - 连接表上的部分删除