【问题标题】:Reloading keys in AVAsset when status is AVKeyValueStatusFailed当状态为 AVKeyValueStatusFailed 时重新加载 AVAsset 中的键
【发布时间】:2014-01-16 02:24:49
【问题描述】:

我正在做以下事情:

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

问题从这里开始。我想AVAsset 会继续尝试重新加载tracks 属性,因为它之前失败了。然而,这似乎并没有发生。 statusOfValueForKey:error: 仍会返回 AVKeyValueStatusFailed,尽管有可用的 Internet 连接并且可以播放视频。

有没有办法重置这个给定属性的状态并尝试另一个加载?有没有其他方法可以解决这个问题?

【问题讨论】:

  • 只是一种可能,你有没有试过在失败后做cancelLoading
  • 你检查每一个键吗?每个键都有自己的状态并且随机出现(不是真的,但这就是时间明智的感觉),而不是同时出现。视频流的第一条规则是它真的比看起来更奇怪

标签: ios avfoundation avasset


【解决方案1】:
  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];
             });
         }];
    }
}

【讨论】:

  • 我正在重用相同的 AVURLAsset。我正在调度回主队列,是的。
  • 重试重新创建AVURLAsset,基本上从头开始。我假设失败后还有一些状态。只要您没有传入 AVURLAssetPreferPreciseDurationAndTimingKey 选项,创建资产应该很快。
猜你喜欢
  • 2014-03-09
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
相关资源
最近更新 更多