Как AVPlayer / AVPlayerItem информирует мое приложение о недостижимом сбое сети?

Я использую AVPlayer для реализации пользовательского видеопроигрывателя в приложении iOS. Для воспроизведения видео из сети я выделяю плеер:

 [[AVPlayer alloc] initWithURL:_URL]; 

Создайте актив:

 AVURLAsset *asset = [AVURLAsset URLAssetWithURL:self.URL options:@{AVURLAssetPreferPreciseDurationAndTimingKey : @(YES)}]; 

загрузите playable клавишу асинхронно:

 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 никогда не вызывается (даже после ожидания минут), и поэтому я не знаю, когда показывать сообщение пользователю, что загрузка видео не удалась.

Мои вопросы:

  1. Я что-то упустил / есть лучший способ справиться с этим?
  2. Должен ли я loadValuesAsynchronouslyForKeys: свою собственную логику тайм-аута или мне просто не loadValuesAsynchronouslyForKeys: когда Reachability считает, что сеть недоступна.
  3. Каковы наилучшие практики в отношении AVPlayer и сетевых сбоев?

Вы должны наблюдать (KVO) особенности AVPlayerItem, которые показывают, как работает буфер, например, playbackBufferEmpty и т. Д.

Оказывается, это могло быть связано с тем, как я тестировал. Использование кондиционера Network Link не запускало блок, но когда я фактически заблокировал хост, используя Charles Proxy, все работало по назначению. На данный момент я пытаюсь использовать свой оригинальный код и добавлю некоторые идеи Дэна, если это окажется проблематичным еще во время тестирования в реальном мире

Я уже интегрировал AVAsset раньше, но не столкнулся с этой конкретной проблемой. Тем не менее, вот что я сделал бы:

  1. Установите таймер или отложенную отправку блока в течение времени ожидания, которое вы хотите применить.
  2. Проверьте значение «воспроизводимого» ключа с помощью statusOfValueForKey:error:
  3. Если статус не AVKeyValueStatusLoaded или ошибка не равна нулю, вызовите [asset cancelLoading] и покажите сообщение об ошибке пользователю или какую бы очистку вам не понадобилось.
Interesting Posts
Давайте будем гением компьютера.