我正在处理一个应用程序,其中提要中有视频循环(内部表观视图单元格(。可以同时存在多个视频,但其中只有一个可能正在播放。我正在背景中创建AVPlayer
S,并将其playerLayer
S作为子视图中的视图放入我的视图层中,并在用户停止滚动Feed时播放屏幕上的视频。
但是,最近我注意到当用户停止滚动时,该视频未显示在Feed中。声音立即启动,但没有显示视频。我已经检查了玩家层的边界,这很好。我已经看过Avplayerlayer显示黑屏,但声音在起作用,但是这个问题仅适用于旧版本的iOS。我还看过Avplayer视频空白,但听到声音,但是由于OP意识到该层的边界为零rect时,该问题得到了解决。我添加了一个计时器来重复打印视频播放器的界限,即使没有显示视频,范围也正确。
几秒钟的声音播放后,该视频就可以完美地播放。我仔细检查了"踢"是否重合视频回到0:00。它只是在视频的随机部分中启动。我还迭代了所有超级层次,直到到达UIWindow
的层为止。层层次结构正确到达窗口的层,并且中间层没有零矩形。另外,当视频随机启动时,上述数据(超级层,其矩形(根本没有改变。可以肯定的是,我添加了以下代码,并且没有任何断言失败(我已经有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");
}];
一些观察和摘要:
- 视频总是在第一次尝试时正确播放。问题从我播放另一个视频开始,然后回来。
- 没有一个层/视图的rect为零,并且一直到窗口的层。我用计时器每秒10次检查一下,一切看起来都很完美。
- 即使在随后的"有问题的"播放中,声音也不会立即开始。简而言之:声音根本没有问题。
- 这些视频是通过网络流式传输的(从我们自己的S3存储桶中(,但是已经加载了,因为它们可以播放到结束并在问题开始之前循环,因为问题并非在第一次播放时发生。
- 我正在使用
AVPlayer
/AVPlayerLayer
组合,而我 not 再次为同一视频创建新播放器或层再次。 - 我在iOS 11.2.5和iPhone X上,尽管我也尝试了模拟器,并且存在问题,所以我认为它与设备无关。
可能是什么问题?
好吧,我错过了必须在主队列上调用播放器的界限的事实。我在背景队列上称其为从主要队列(显然失败的(中卸载一些工作,这导致了不确定的行为。我已将其派遣到主要队列,然后开始正确工作。