Приложение зависает при плохом сетевом соединении и проигрывании AVPlayer - PullRequest
0 голосов
/ 03 ноября 2018

Я разрабатываю радио приложение для iOS. когда сетевое соединение исправно, приложение работает нормально.

Мой сценарий немного отличается. Я ограничил скорость мобильной передачи данных в iphone (Настройки -> Разработчик -> Network Link Conditioner) и выбрал плохую опцию сети из списка. В это время проигрыватель пытается выполнить потоковую передачу аудиосодержимого, и если я пытаюсь представить или отклонить контроллер представления, приложение либо замедляется, либо зависает. Я пытался представить контроллер представления из главной очереди, но это не сработало.

   let requestedKey = ["playable","duration"]
            asset.loadValuesAsynchronously(forKeys: requestedKey) {
                DispatchQueue.main.async{
                    var error: NSError?
                    let keyStatus = asset.statusOfValue(forKey: "playable", error: &error)
                    if keyStatus == AVKeyValueStatus.failed || !asset.isPlayable {
                        completionHandler(false, nil)
                        return
                    }
                    completionHandler(true, asset)
                }
            }

if player == nil {
            player = AVPlayer()

        }
        playerItem = AVPlayerItem(asset: asset)

Вот так я настраиваю плеер. Пожалуйста, помогите мне решить эту серьезную проблему производительности, когда соединение плохое или ненадежное.

1 Ответ

0 голосов
/ 19 декабря 2018

Существует много дел для управления плохим сетевым подключением и возобновления воспроизведения при использовании AVPlayer.

Но речь идет не об управлении потоками.

Когда AVPlayerItem не удалось: AVPlayerItem.Status == .failed, необходимо инициировать новый объект AVPlayerItem и добавить его в AVPlayer. Вы можете использовать replaceCurrentItem(with:) метод AVPlayer.

Кроме того, для обнаружения любой неудачной ситуации воспроизведения вы можете наблюдать следующие уведомления:

  • AVPlayerItemPlaybackStalled
  • AVPlayerItemDidPlayToEndTime (срабатывает также при пустом буфере И выход в сеть)
  • AVPlayerItemFailedToPlayToEndTime

Вы можете проверить библиотеку [ModernAVPlayer][1], особенно файл PlayingState.swift, чтобы понять процесс.

...