AVPlayerLayer 没有出现几秒钟,但声音完美

AVPlayerLayer doesn't appear for a few seconds but sound works perfectly

我正在开发一个应用程序,其中提要中有循环播放的视频(在 table 视图单元格内)。可以同时存在多个视频,但可能只有一个正在播放。我在后台创建 AVPlayers,并将它们的 playerLayers 作为子视图放入我的视图层,并在用户停止滚动提要时在屏幕上播放视频。

但是,最近我注意到当用户停止滚动时视频不会显示在提要中。声音立即开始,但不显示视频。我检查了播放器层的边界是否完全正常。我已经看到 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 的上述数据(超级层,它们的矩形)完全改变。可以肯定的是,我添加了以下代码并且没有遇到任何断言失败(我已经在其中包含 NSLogs,所以是的,它被称为):

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");
}]; 

一些观察和总结:

可能是什么问题?

好吧,我忽略了必须在主队列上调用设置玩家边界的事实。我在后台队列上调用它以从主队列中卸载一些工作(显然失败了),这导致了未定义的行为。我已将它发送到主队列,它开始正常工作。