2016-02-13 11 views
7

Moja aplikacja iOS używa AVPlayer do strumieniowego przesyłania multimediów z Internetu. Używam KVO do wykrywania zdarzeń, takich jak buforowanie (playbackBufferEmpty) i bycie złapanym (playbackLikelyToKeepUp). Zauważyłem jednak niesamowicie specyficzny błąd. Chociaż podczas większości spowolnień sieciowych trafia playbackBufferEmpty KVO, a po jego odzyskaniu, playbackLikelyToKeepUp KVO jest trafiony zgodnie z oczekiwaniami, zauważyłem (z pewną częstotliwością), że AVPlayer będzie buforował przez pewien okres czasu, odzyskać, playbackLikelyToKeepUp trafiony , dźwięk będzie odtwarzany przez około 1-3 sekund, a następnie dźwięk przestanie być odtwarzany ponownie, tak jakby był buforowany - bez ponownego kliknięcia w KVO . I nie wychodzi z tego.AVPlayer Nie odzyskuje po buforowaniu

TL; DR: playbackBufferEmpty (10-20 sekund) ->playbackLikelyToKeepUp -> gra dla 1-3s -> przestaje grać, ale nie ma KVO.

Najgorsze, gdy tak się stanie, AVPlayer nie uruchamia się automatycznie ponownie, tak jak podczas odzyskiwania po buforowaniu, a aplikacja milczy, aż AVPlayer zostanie ręcznie zatrzymana/uruchomiona ponownie. Zdarza się to mniej więcej za każdym razem, gdy w końcu będę streamować. Czy jest to znany problem z AVPlayer? Czy to jakieś trzecie wydarzenie KVO, które mogę obejrzeć? Lub jakieś wskazówki, jak to debugować? Dzięki!

EDIT: Dodatkowe informacje: AVPlayer „s error nieruchomość jest nil, kiedy to nastąpi, obiekt status jest gotowy do gry, a właściwość rate to 1. AKA Nic innego dziwnie dzieje, o ile mi móc powiedzieć.

Odpowiedz

0

Mam również doświadczył problemów z AVPlayer wychodzenie z problemów buforowanie/sieciowych, a ja też mam dokładnie ten sam scenariusz, w którym avPlayer.status jest .readyToPlay, avPlayer.error jest nil i avPlayer.rate jest 1. Mów o niewiarygodności! Sprawdziłem również numer errorLog(), który nie zawiera niczego istotnego poza ogólnym błędem połączenia internetowego.

Próbuję wykryć ten stan, mając zegar, który po przekroczeniu limitu czasu sprawdzam bieżący czas wideo i czas, kiedy zegar się uruchomił i jeśli jest taki sam (wideo nie rozwijało się), możemy założyć wideo naprawdę nie gra, kiedy twierdzi, że tak jest.

Następnie traktuję to jako stan nieodzyskiwany i ponownie załaduję cały strumień, tworząc nowy AVPlayerItem.