我正在使用AVPlayer
在iOS应用程序中实现自定义视频播放器。要从网络播放视频我分配了一个播放器:
[[AVPlayer alloc] initWithURL:_URL];
创建资产:
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:self.URL
options:@{AVURLAssetPreferPreciseDurationAndTimingKey : @(YES)}];
异步加载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
永远不会被调用(即使在等待几分钟后),所以我不知道何时向用户显示一条消息加载视频失败。
我的问题是:
loadValuesAsynchronouslyForKeys:
认为无法访问网络时,我永远不会Reachability
。AVPlayer
和网络故障的最佳做法是什么?答案 0 :(得分:4)
您应该观察AVPlayerItem的(KVO)功能,揭示缓冲区的运作方式,例如playbackBufferEmpty
等。
答案 1 :(得分:1)
之前我已经集成了AVAsset,但没有遇到这个具体问题。尽管如此,这就是我要做的事情:
statusOfValueForKey:error:
检查“可播放”键的值。AVKeyValueStatusLoaded
或错误不是nil,请致电[asset cancelLoading]
并向用户显示错误消息或您可能需要进行的任何清理。答案 2 :(得分:1)
事实证明,这可能与我测试的方式有关。使用Network Link调节器没有触发阻塞,但是当我使用Charles Proxy实际阻止主机时,一切都按预期工作。我现在正尝试使用我的原始代码,并且如果在现实世界测试期间证明它仍然存在问题,我将添加一些Dan的想法