AVPlayer / AVPlayerItem如何通知我的应用程序有关不可达的networking故障?

我正在使用AVPlayer在iOS应用程序中实现自定义video播放器。 要从networking播放video,我分配一个播放器:

 [[AVPlayer alloc] initWithURL:_URL]; 

创build资产:

 AVURLAsset *asset = [AVURLAsset URLAssetWithURL:self.URL options:@{AVURLAssetPreferPreciseDurationAndTimingKey : @(YES)}]; 

asynchronous加载playable密钥:

 NSArray *keys = @[@"playable"]; [asset loadValuesAsynchronouslyForKeys:keys completionHandler:^{ dispatch_async(dispatch_get_main_queue(), ^{ for (NSString *key in keys) { NSError *error; AVKeyValueStatus status = [asset statusOfValueForKey:key error:&error]; if (status == AVKeyValueStatusFailed) { NSLog(@"Failed to load asset key %@ error %@", key, [error localizedDescription]); [self fail]; return; } } if (asset.isPlayable) { [self.player replaceCurrentItemWithPlayerItem:self.playerItem]; } else { [self fail]; } }); }]; 

问题是,当设备没有互联网连接或高丢包时, completionHandler从不被调用(即使等待几分钟后),所以我不知道何时向用户显示加载video失败的消息。

我的问题是:

  1. 我错过了什么/有没有更好的办法来处理这个?
  2. 我应该推出我自己的超时逻辑,或者我应该从来没有loadValuesAsynchronouslyForKeys:何时Reachability相信networking不可达。
  3. 有关AVPlayer和networking故障的最佳做法是什么?

您应该观察AVPlayerItem的(KVO)function,以显示缓冲区的工作方式,如playbackBufferEmpty等。

事实certificate,这可能与我testing的方式有关。 使用Network Link调节器不会触发块,但是当我使用Charles Proxy实际阻止主机时,一切都按预期工作。 我现在正在尝试使用我的原始代码,并且如果在现实世界的testing中certificate问题仍然存在,那么会添加Dan的一些想法

我之前已经集成了AVAsset,但还没有遇到这个特定的问题。 尽pipe如此,我会这样做:

  1. 设置一个计时器或延迟块调度的时间长度,你想强制执行。
  2. 使用statusOfValueForKey:error:检查“可播放”键的值。
  3. 如果状态不是AVKeyValueStatusLoaded或错误不为零,请调用[asset cancelLoading]并向用户显示一条错误消息或进行任何需要清理的操作。