AVPlayerLayer 在几秒钟内不会出现,但声音效果很好



我正在处理一个应用程序,其中提要中有视频循环(内部表观视图单元格(。可以同时存在多个视频,但其中只有一个可能正在播放。我正在背景中创建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上,尽管我也尝试了模拟器,并且存在问题,所以我认为它与设备无关。

可能是什么问题?

好吧,我错过了必须在主队列上调用播放器的界限的事实。我在背景队列上称其为从主要队列(显然失败的(中卸载一些工作,这导致了不确定的行为。我已将其派遣到主要队列,然后开始正确工作。

最新更新