Jak zmniejszyć opóźnienie startu iOS AVPlayer

Uwaga dla poniższego pytania: Wszystkie zasoby są lokalne na urządzeniu - nie ma strumieniowania sieciowego. Filmy zawierają ścieżki dźwiękowe.

Pracuję na aplikacji iOS, która wymaga odtwarzania plików wideo z minimalnym opóźnieniem, aby rozpocząć dany klip wideo. Niestety nie wiemy, jaki konkretny klip wideo będzie następny, dopóki nie będziemy musieli go uruchomić. W szczególności: Gdy odtwarzany jest jeden klip wideo, będziemy wiedzieć, jaki jest następny zestaw (w przybliżeniu) 10 klipów wideo, ale nie wiemy, który dokładnie, dopóki nie nadejdzie czas „natychmiastowego” odtworzenia następnego klipu.

To, co zrobiłem, aby przyjrzeć się rzeczywistym opóźnieniom, to zadzwonićaddBoundaryTimeObserverForTimes na odtwarzaczu wideo, z okresem czasu wynoszącym jedną milisekundę, aby zobaczyć, kiedy film rzeczywiście zaczął się odtwarzać, i biorę różnicę tego znacznika czasu z pierwszym miejscem w kodzie, które wskazuje, który zasób rozpocząć odtwarzanie.

Z tego co widziałem do tej pory odkryłem, że używając kombinacjiAVAsset ładowanie, a następnie tworzenieAVPlayerItem od tego momentu jest gotowy, a następnie czekaAVPlayerStatusReadyToPlay zanim zadzwonię do gry, zwykle trwa od 1 do 3 sekund, aby rozpocząć klip.

Od tamtej pory przeszedłem na coś, co uważam za mniej więcej równoważne: dzwonienie[AVPlayerItem playerItemWithURL:] i czekam naAVPlayerItemStatusReadyToPlay grać. Mniej więcej taka sama wydajność.

Jedną z rzeczy, które obserwuję, jest to, że pierwsze ładowanie elementów AVPlayera jest wolniejsze niż reszta. Wydaje się, że jednym z pomysłów jest przed lotem AVPlayera z krótkim / pustym zasobem przed próbą odtworzenia pierwszego wideo może być dobrą ogólną praktyką. [Powolny start dla AVAudioPlayer przy pierwszym odtwarzaniu dźwięku

Chciałbym, aby czas rozpoczęcia wideo był jak najmniejszy, a niektóre pomysły na eksperymenty, ale chciałbym otrzymać wskazówki od każdego, kto może pomóc.

Aktualizacja: pomysł 7, poniżej, w czasie realizacji daje czasy przełączania około 500 ms. To ulepszenie, ale miło byłoby uzyskać to jeszcze szybciej.

Idea 1: Użyj N odtwarzaczy AV (nie działa)

Używając ~ 10AVPPlayer obiekty i rozpocznij i wstrzymaj wszystkie ~ 10 klipów, a kiedy już wiemy, której naprawdę potrzebujemy, przełącz się i wyłącz pauzęAVPlayeri zacznij wszystko od nowa w następnym cyklu.

Nie sądzę, żeby to działało, ponieważ przeczytałem, że jest około 4 aktywnych limitówAVPlayer's w iOS. Ktoś zapytał o to w StackOverflow tutaj i dowiedział się o 4 limicie AVPlayer:szybkie przełączanie między filmami przy użyciu avfoundation

Idea 2: Użyj AVQueuePlayer (nie działa)

Nie wierzę, że wpakowanie 10AVPlayerItems wAVQueuePlayer wstępnie załaduje je wszystkie, aby zapewnić bezproblemowy startAVQueuePlayer jest kolejką i myślę, że naprawdę sprawia, że ​​następny film w kolejce jest gotowy do natychmiastowego odtwarzania. Nie wiem, który z 10 filmów chcemy odtworzyć, dopóki nie nadejdzie czas na rozpoczęcie tego.ios-avplayer-video-preloading

Idea 3: Załaduj, graj i zachowajAVPlayerItems w tle (jeszcze nie na 100% - ale nie wygląda dobrze)

Patrzę na to, czy istnieje jakakolwiek korzyść z załadowania i odtworzenia pierwszej sekundy każdego klipu wideo w tle (stłumienie wyjścia wideo i audio) i zachowanie odniesienia do każdegoAVPlayerItem, a kiedy wiemy, który przedmiot musi być odtwarzany na serio, zamień go i zamień AVPlayer w tle z aktywnym. Wypłukać i powtórzyć.

Teoria byłaby ostatnio granaAVPlayer/AVPlayerItemmogą nadal zawierać niektóre przygotowane zasoby, które przyspieszyłyby późniejsze odtwarzanie. Do tej pory nie widziałem korzyści z tego, ale może nie miećAVPlayerLayer ustaw poprawnie dla tła. Wątpię, czy to naprawdę poprawi to, co widziałem.

Idea 4: Użyj innego formatu pliku - może taki, który szybciej się ładuje?

Obecnie używam formatu H.264 .m4v (wideo-MPEG4). H.264 ma wiele różnych opcji kodeków, więc możliwe jest, że niektóre opcje będą szybciej wyszukiwane niż inne. Odkryłem, że użycie bardziej zaawansowanych ustawień, które zmniejszają rozmiar pliku, zwiększa czas wyszukiwania, ale nie znalazłem żadnych opcji, które idą w drugą stronę.

Idea 5: Połączenie bezstratnego formatu wideo + AVQueuePlayer

Jeśli istnieje format wideo, który można szybko załadować, ale może w przypadku, gdy rozmiar pliku jest szalony, jednym z pomysłów może być wstępne przygotowanie pierwszych 10 sekund każdego klipu wideo z wersją, która jest nadęta, ale szybsza do załadowania, ale z powrotem to z zasobem zakodowanym w H.264. Użyj AVQueuePlayer i dodaj pierwsze 10 sekund w nieskompresowanym formacie pliku, a następnie wykonaj to w H.264, który otrzyma do 10 sekund czasu przygotowania / ładowania wstępnego. Dostałbym więc „najlepsze” z obu światów: szybkie czasy rozpoczęcia, ale także korzyści z bardziej kompaktowego formatu.

Idea 6: Użyj niestandardowego AVPlayera / napisz mój własny / użyj cudzego

Biorąc pod uwagę moje potrzeby, może nie mogę korzystać z AVPlayera, ale muszę uciekać się do AVAssetReader i dekodować pierwsze kilka sekund (prawdopodobnie napisać surowy plik na dysk), a jeśli chodzi o odtwarzanie, użyć surowego formatu, aby go odtworzyć z powrotem szybko. Wydaje mi się, że to ogromny projekt, a jeśli pójdę na to w sposób naiwny, nie jest jasne, czy nawet działa lepiej. Każda zdekodowana i nieskompresowana klatka wideo wynosi 2,25 MB. Mówiąc naiwnie - jeśli pójdziemy z ~ 30 fps na wideo, skończy się na ~ 60 MB / s wymaganiu odczytu z dysku, co jest prawdopodobnie niemożliwe / pchanie go. Oczywiście musielibyśmy zrobić pewien poziom kompresji obrazu (być może natywne formaty kompresji openGL / es przez PVRTC) ... ale to jest szalone. Może jest tam biblioteka, z której mogę skorzystać?

Pomysł 7: Połącz wszystko w jeden zasób filmu i czas wyszukiwania

Jednym z pomysłów, który może być łatwiejszy niż niektóre z powyższych, jest połączenie wszystkiego w jeden film i użycie funkcji seekToTime. Chodzi o to, że skakalibyśmy po całym miejscu. Zasadniczo losowy dostęp do filmu. Myślę, że to może się udać:avplayer-movie-playing-lag-in-ios5

Jakie podejście uważasz za najlepsze? Do tej pory nie zrobiłem tak dużego postępu w zakresie zmniejszenia opóźnienia.

questionAnswers(5)

yourAnswerToTheQuestion