我正在开发一个应用,其中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");
}];
一些观察和总结:
AVPlayer
/ AVPlayerLayer
组合,我不再次为同一个视频创建新的播放器或图层,我有一个URL-to字典 - 玩家/图层映射,我再次使用它们。可能是什么问题?