2014-01-15 157 views
4

我做了以下内容:重新加载密钥时状态AVKeyValueStatusFailed

  • 创建一个新的AVAsset与给定的URL。该URL指向远程Web服务器上的视频。
  • 尝试通过调用loadValuesAsynchronouslyForKeys:completionHandler:
  • 初始请求失败,我注意到,请求失败致电statusOfValueForKey:error:
  • 加载tracks属性,因为没有互联网连接的存在
  • 然后我等待连接,重新出现(使用一些可达性代码)。一旦它发生,我再次拨打loadValuesAsynchronouslyForKeys:completionHandler:

以下是问题出现的地方。我会想象,AVAsset继续并尝试重新加载轨道属性,因为它以前失败。但是,这似乎并没有发生。 statusOfValueForKey:error:仍然会返回AVKeyValueStatusFailed,尽管有效的互联网连接可用且视频可播放。

有没有办法重置这个给定属性的状态并尝试另一个负载?有其他解决方法吗?

+0

只是一种可能性,你试过'cancelLoading'后失败了吗? – Peres

+0

你在检查每个键吗?每个键都有自己的状态,并随机出现(不是真的,但这是它如何感觉时间上的明智),而不是全部在同一时间。视频流的第一条规则是它比它看起来更奇怪 – Michael

回答

2
  1. 你正在创建一个新的AVURLAsset或只是重复使用前一个?
  2. 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]; 
      }); 
     }]; 
    } 
} 
+0

我正在重复使用相同的AVURLAsset。我正在派遣回主队列,是的。 – mplappert

+0

重试重新创建AVURLAsset,基本上从头开始。我认为在失败后还有一些状态。只要您未传入AVURLAssetPreferPreciseDurationAndTimingKey选项,创建资产应该很快。 – Jesse