2014-01-15 2 views
4

Я делаю следующее:Перегрузочные ключи в AVAsset когда статус AVKeyValueStatusFailed

  • Создать новый AVAsset с заданным URL. Этот URL указывает на видео на удаленном веб-сервере.
  • Попытка загрузить tracks свойство по телефону loadValuesAsynchronouslyForKeys:completionHandler:
  • Первоначальный запрос терпит неудачу, потому что нет подключения к Интернету не существует
  • Я заметил, что запрос не был по телефону statusOfValueForKey:error:
  • Я тогда ждать подключения вновь появится (используя некоторый код достижимости). Как только это произойдет, я снова звоню 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