AVPlayerLayer几秒钟没有出现,但声音效果很好

时间:2018-02-24 21:07:42

标签: ios video avplayer avplayerlayer

我正在开发一个应用,其中Feed会在其中循环播放视频(在表格视图中)。可以同时存在多个视频,但其中只有一个可能正在播放。我正在后台创建AVPlayer,并将他们的playerLayer作为子视图放入我的视图层,并在用户停止滚动Feed时播放屏幕上区域最多的视频。

但是,最近我注意到当用户停止滚动时,视频不会显示在Feed中。声音立即开始,但不显示视频。我已经检查了玩家图层的界限是否完美无缺。我见过AVPlayerLayer shows black screen but sound is working,但该问题仅适用于旧版iOS。我也见过AVPlayer Video Blank but Hear Sound但是这个问题已经解决,因为OP意识到图层的边界是零矩形。我已经添加了一个计时器来重复打印我的视频播放器的边界,即使没有显示视频,边界也是正确的。

经过几秒钟的纯音播放后,视频才能完美播放。我已经仔细检查了“踢进去”与视频寻求回到0:00不一致。它只是在视频的随机部分开始。我还迭代了所有的超级层,直到我到达UIWindow的层。图层层次结构正确到达窗口的图层,并且没有任何中间图层具有零rect。此外,当视频随机启动时,上述数据(超级层,它们的部分)都没有变化。只是为了确定,我添加了以下代码,我没有得到任何断言失败(我已经有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");
}]; 

一些观察和总结:

  • 视频始终在第一次尝试时正常播放。当我播放另一个视频然后回来时,问题就出现了。
  • 没有任何图层/视图具有零矩形,并且它一直到窗口的图层。我用一个计时器每秒钟检查一次10次,一切看起来都很完美。
  • 声音立即开始,没有延迟,即使在随后的“有问题”播放中也是如此。简而言之:声音完全没有问题。
  • 视频通过网络流式传输(来自我们自己的S3存储桶),但已经加载,因为它们可以播放到最后并在问题开始之前循环,因为问题不会在第一次播放时发生。
  • 我正在使用AVPlayer / AVPlayerLayer组合,我再次为同一个视频创建新的播放器或图层,我有一个URL-to字典 - 玩家/图层映射,我再次使用它们。
  • 我在iOS 11.2.5和iPhone X上,虽然我也尝试过模拟器并且存在问题,所以我认为它与设备无关。

可能是什么问题?

0 个答案:

没有答案