状态为AVKeyValueStatusFailed时,重新加载AVAsset中的密钥
我正在做以下事情:
- 使用给定的URL创build一个新的
AVAsset
。 该URL指向远程Web服务器上的video。 - 尝试通过调用
loadValuesAsynchronouslyForKeys:completionHandler:
来加载tracks
属性loadValuesAsynchronouslyForKeys:completionHandler:
- 初始请求失败,因为没有互联网连接
- 我注意到通过调用
statusOfValueForKey:error:
失败的请求statusOfValueForKey:error:
- 然后等待连接重新出现(使用一些可达性代码)。 一旦这样做,我再次调用
loadValuesAsynchronouslyForKeys:completionHandler:
这是问题出现的地方。 我会想象, AVAsset
继续并尝试重新加载的轨道属性,因为它以前失败。 但是,这似乎并没有发生。 statusOfValueForKey:error:
仍然会返回AVKeyValueStatusFailed
,尽pipe可用的互联网连接可用且video可播放。
有没有办法重置这个给定的属性的状态,并尝试另一个负载? 有没有其他的方法来解决这个问题?
- 你正在创build一个新的AVURLAsset或只是重复使用前一个?
- 在
loadValuesAsynchronouslyForKeys:completionHandler:
的完成处理程序中loadValuesAsynchronouslyForKeys:completionHandler:
你是否调度回主线程?
如果您在准备重试时再次调用此方法(或类似方法)会发生什么情况。
- (void)setContentURL:(NSURL *)contentURL { if (_contentURL != contentURL) { _contentURL = contentURL; AVURLAsset *asset = [AVURLAsset URLAssetWithURL:_contentURL options:nil]; NSArray *requestedKeys = [NSArray arrayWithObjects:ISIVideoPlayerControllerTracksKey, ISIVideoPlayerControllerPlayableKey, nil]; [asset loadValuesAsynchronouslyForKeys:requestedKeys completionHandler: ^{ dispatch_async(dispatch_get_main_queue(), ^{ [self prepareToPlayAsset:asset withKeys:requestedKeys]; }); }]; } }