繁体   English   中英

将 AVPlayer 分配给 AVPlayerLayer 异步轮流玩家 currentTime

[英]Assigning AVPlayer to AVPlayerLayer rounds players currentTime asyncronously

我试图在两个地方显示单个视频并使它们同步。

我创建 AVPlayer,将其分配给 AVPlayerLayer 并播放大约一秒钟。 在创建第二个 AVPlayerLayer 之后,将 sme AVPlayer 分配给它。

那时我希望两个层都显示相同的帧,因为它们由同一个 AVPlayer 支持,但是将 AVPlayer 分配给第二个 AVPlayerLayer 的行为由于某种原因改变了播放器的当前时间。

这是说明我的问题的代码。 在视频播放大约一秒钟然后暂停后调用此逻辑:

print("\(player.currentTime())") // CMTime(value: 111158, timescale: 90000)

_ = AVPlayerLayer(player: player)

print("\(player.currentTime())") // CMTime(value: 111158, timescale: 90000)

DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
    print("\(player.currentTime())") // CMTime(value: 600, timescale: 600)
}

当前时间在视频的不同部分和不同视频中以类似方式修改。 例如从CMTime(value: 175196, timescale: 90000)CMTime(value: 1220, timescale: 600)

我在任何时候都不调用seek(to:toleranceBefore:toleranceAfter:)方法。

周期性时间观察器被新的舍入值触发,但我无法根据那里的堆栈跟踪找出是什么触发了时间变化。

如果玩家时间已经在 600 时间尺度 - 创建 AVPlayerLayer 时没有时间变化。

我试图缓解这种情况的一种选择是在创建第二个 AVPlayerLayer 之前存储currentTime ,然后让玩家回到它,但目前还不清楚这种舍入究竟发生在什么时候。 在某个任意时间间隔后将其异步化让我感到不舒服,因为这看起来不像是长期解决方案。

我想准备要渲染的 AVPlayer 内容背后的某些逻辑是造成此舍入的原因,但我无法在 AVPlayerLayer、AVPlayer 或 AVPlayerItem 文档中找到与容差相关的任何内容。

对于 AVPlayer 为什么调整当前时间以及如何禁用此行为的任何建议,我将不胜感激。

在与 Apple Developer Technical Support 深入讨论后,我得到以下解释:

此框架更改的原因与添加新视图无关。 玩家暂停和恢复这个简单的事实可以改变时间刻度,从而改变玩家当前时间的值。 压缩格式通常包含携带完整图像的帧,以及依赖于要解码的周围帧的帧。 在播放器暂停后添加视图时,这种效果会变得更加明显,但根本原因是播放/暂停机制本身,而不是添加子视图或子层。

也许这会对某人有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM