AVPlayerLayer 没有出现几秒钟,但声音完美
AVPlayerLayer doesn't appear for a few seconds but sound works perfectly
我正在开发一个应用程序,其中提要中有循环播放的视频(在 table 视图单元格内)。可以同时存在多个视频,但可能只有一个正在播放。我在后台创建 AVPlayer
s,并将它们的 playerLayer
s 作为子视图放入我的视图层,并在用户停止滚动提要时在屏幕上播放视频。
但是,最近我注意到当用户停止滚动时视频不会显示在提要中。声音立即开始,但不显示视频。我检查了播放器层的边界是否完全正常。我已经看到 AVPlayerLayer shows black screen but sound is working but that question applies only to an older version of iOS. I've also seen AVPlayer Video Blank but Hear Sound 但这个问题已经解决,因为 OP 意识到图层的边界是零矩形。我添加了一个计时器来重复打印我的视频播放器的边界,即使不显示视频,边界也是正确的。
经过几秒钟的纯声音播放后,视频完美地开始播放。我仔细检查了 "kick in" 是否与回溯到 0:00 的视频重合。它只是在视频的随机部分开始。我还迭代了所有超级层,直到到达 UIWindow
层。图层层次结构正确到达 window 的图层,并且 none 的中间图层具有零矩形。此外,当视频随机播放时,none 的上述数据(超级层,它们的矩形)完全改变。可以肯定的是,我添加了以下代码并且没有遇到任何断言失败(我已经在其中包含 NSLog
s,所以是的,它被称为):
timer = [NSTimer scheduledTimerWithTimeInterval:0.1 repeats:YES block:^(NSTimer * _Nonnull timer) {
NSAssert(_playerLayer.bounds.size.width, @"bounds");
NSAssert(_playerLayer.bounds.size.height, @"bounds");
NSAssert(!_playerLayer.hidden, @"hidden");
BOOL inWindow = NO;
CALayer *layer = _playerLayer.superlayer;
while(layer){
layer = layer.superlayer;
NSAssert(layer.bounds.size.width, @"bounds");
NSAssert(layer.bounds.size.height, @"bounds");
NSAssert(!layer.hidden, @"hidden");
if(layer == [UIApplication sharedApplication].keyWindow.layer){
inWindow = YES;
break;
}
}
NSAssert(inWindow, @"not in window");
}];
一些观察和总结:
- 视频总是在第一次尝试时播放正确。当我播放另一个视频,然后再回来时,问题就出现了。
layers/views 的 - None 有零矩形,它一直到 window 的层。我每秒用计时器循环检查 10 次,一切看起来都很完美。
- 声音立即开始,没有延迟,即使在随后的 "problematic" 播放中也是如此。总之:声音完全没有问题
- 视频通过网络流式传输(来自我们自己的 S3 存储桶),但已经加载,因为它们可以播放到最后并在问题开始之前循环播放,因为问题不会在第一次播放时出现无论如何。
- 我正在使用
AVPlayer
/AVPlayerLayer
组合,我 不会 再次为同一视频创建新的播放器或图层,我有一个URL-to-player/layer 映射字典,我再次使用它们。
- 我在 iOS 11.2.5 和 iPhone X 上,虽然我也尝试过模拟器并且问题存在,所以我认为它与设备无关。
可能是什么问题?
好吧,我忽略了必须在主队列上调用设置玩家边界的事实。我在后台队列上调用它以从主队列中卸载一些工作(显然失败了),这导致了未定义的行为。我已将它发送到主队列,它开始正常工作。
我正在开发一个应用程序,其中提要中有循环播放的视频(在 table 视图单元格内)。可以同时存在多个视频,但可能只有一个正在播放。我在后台创建 AVPlayer
s,并将它们的 playerLayer
s 作为子视图放入我的视图层,并在用户停止滚动提要时在屏幕上播放视频。
但是,最近我注意到当用户停止滚动时视频不会显示在提要中。声音立即开始,但不显示视频。我检查了播放器层的边界是否完全正常。我已经看到 AVPlayerLayer shows black screen but sound is working but that question applies only to an older version of iOS. I've also seen AVPlayer Video Blank but Hear Sound 但这个问题已经解决,因为 OP 意识到图层的边界是零矩形。我添加了一个计时器来重复打印我的视频播放器的边界,即使不显示视频,边界也是正确的。
经过几秒钟的纯声音播放后,视频完美地开始播放。我仔细检查了 "kick in" 是否与回溯到 0:00 的视频重合。它只是在视频的随机部分开始。我还迭代了所有超级层,直到到达 UIWindow
层。图层层次结构正确到达 window 的图层,并且 none 的中间图层具有零矩形。此外,当视频随机播放时,none 的上述数据(超级层,它们的矩形)完全改变。可以肯定的是,我添加了以下代码并且没有遇到任何断言失败(我已经在其中包含 NSLog
s,所以是的,它被称为):
timer = [NSTimer scheduledTimerWithTimeInterval:0.1 repeats:YES block:^(NSTimer * _Nonnull timer) {
NSAssert(_playerLayer.bounds.size.width, @"bounds");
NSAssert(_playerLayer.bounds.size.height, @"bounds");
NSAssert(!_playerLayer.hidden, @"hidden");
BOOL inWindow = NO;
CALayer *layer = _playerLayer.superlayer;
while(layer){
layer = layer.superlayer;
NSAssert(layer.bounds.size.width, @"bounds");
NSAssert(layer.bounds.size.height, @"bounds");
NSAssert(!layer.hidden, @"hidden");
if(layer == [UIApplication sharedApplication].keyWindow.layer){
inWindow = YES;
break;
}
}
NSAssert(inWindow, @"not in window");
}];
一些观察和总结:
- 视频总是在第一次尝试时播放正确。当我播放另一个视频,然后再回来时,问题就出现了。 layers/views 的
- None 有零矩形,它一直到 window 的层。我每秒用计时器循环检查 10 次,一切看起来都很完美。
- 声音立即开始,没有延迟,即使在随后的 "problematic" 播放中也是如此。总之:声音完全没有问题
- 视频通过网络流式传输(来自我们自己的 S3 存储桶),但已经加载,因为它们可以播放到最后并在问题开始之前循环播放,因为问题不会在第一次播放时出现无论如何。
- 我正在使用
AVPlayer
/AVPlayerLayer
组合,我 不会 再次为同一视频创建新的播放器或图层,我有一个URL-to-player/layer 映射字典,我再次使用它们。 - 我在 iOS 11.2.5 和 iPhone X 上,虽然我也尝试过模拟器并且问题存在,所以我认为它与设备无关。
可能是什么问题?
好吧,我忽略了必须在主队列上调用设置玩家边界的事实。我在后台队列上调用它以从主队列中卸载一些工作(显然失败了),这导致了未定义的行为。我已将它发送到主队列,它开始正常工作。