我正在使用AVPlayer在iOS应用程序中实现自定义视频播放器.要从网络播放视频我分配了一个播放器:
[[AVPlayer alloc] initWithURL:_URL];
创建资产:
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:self.URL
options:@{AVURLAssetPreferPreciseDurationAndTimingKey : @(YES)}];
异步加载可播放键:
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(即使在等待几分钟后),因此我不知道何时向用户显示加载视频失败的消息.
我的问题是:
>我错过了什么/有没有更好的方法来处理这个?
>我应该滚动自己的超时逻辑,还是应该永远不会异步加载值:当可达性认为网络无法访问时.
>有关AVPlayer和网络故障的最佳做法是什么?
解决方法
您应该观察AVPlayerItem的(KVO)功能,揭示缓冲区的运行方式,例如playbackBufferEmpty等.