2015-05-20 38 views
8

AVPlayer ma właściwość o nazwie rate, która służy do kontrolowania szybkości odtwarzania. 1.0 to normalna prędkość, podczas gdy wartości takie jak 2.0 lub 5.0 powinny odtwarzać odpowiednio 2x i 5x.Jak uzyskać płynne odtwarzanie z AVPlayera?

Po ustawieniu wartości szybkości odtwarzania wyższej niż 1.0 (na przykład 10.0), odtwarzanie jest bardzo niepewne i wygląda na to, że duża liczba klatek zostaje upuszczona, ponieważ odtwarzacz nie może nadążyć.

Jednak te same wartości w odtwarzaczu QuickTime (z tym samym filmem) zapewniają płynne odtwarzanie z szybkościami 2x, 5x, 10x, 30x and 60x (zgodnie z raportem odtwarzacza QuickTime).

Stworzyłem testową aplikację OS X, która zawiera jedynie plik AVPlayerView i dwa przyciski do ustawiania szybkości odtwarzania. Stawka w wysokości 1.0 działa zgodnie z oczekiwaniami, ale współczynnik 10.0 powoduje bardzo nierówne odtwarzanie.

Jednak AVPlayerView ma dziwne dziwactwo na tym, że jeśli kliknięciem myszy na osi czasu odtwarzania, aby szukać w innym miejscu (w trakcie odtwarzania na 10x i niepewny), wówczas AVPlayerView będzie „naprawić” odtwarzanie i film będą odtwarzane płynnie przy 10x. Wystarczyło kliknąć oś czasu odtwarzania.

Czy ktoś wie, jak uzyskać płynne odtwarzanie w tempie innym niż 1x? Oczywiście nie jest to problem ze sprzętem ani rozmiar pliku, ponieważ może to zrobić zarówno QuickTime Player, jak i AVPlayerView.

Próby

Ten question sugeruje, że może to być problem dźwięku (i rzeczywiście zarówno QuickTime Player i AVPlayerView wyciszyć dźwięk podczas przekazywania), ale wszystkie próby z mojej strony albo wyłączyć wszystkie ścieżki audio, wyciszenie wszystkich ślady lub zmiana algorytmu ścieżki dźwiękowej nie wydają się mieć znaczenia. Odtwarzanie było nadal niestabilne, nawet jeśli nie było dźwięku.

Próbowałem także zatrzymać odtwarzanie, a następnie zadzwonić pod numer prerollAtRate:completionHandler, ale to też nie ma znaczenia.

Co robi odtwarzacz QuickTime Player i AVPlayerView, który umożliwia płynne odtwarzanie filmów z szybkością 10x, 30x lub nawet 60x?

+1

Znaleźliście jakieś rozwiązanie tego problemu? Jeśli tak, to co to było? –

+0

Nie, przepraszam. Skończyło się na tym, że musiałem zbudować własne rozwiązanie, ale nie jest tak dobre, jak bym chciał. Na dłuższą metę uważam, że najlepsze wrażenia podczas odtwarzania będą wymagały głębszego kopania i obsługi dekodowania klatek poza używaniem AVPlayera. – kennyc

+0

Pod kontrolą macos 10.12.3/Xcode 8.2.1, potwierdziłem niektóre z powyższych: prędkości do 2.0 nie stanowi problemu, ale ustawienie "AVPlayer.rate" na wartość większą niż 2,0 powoduje ciągłe odtwarzanie; używanie AVPlayerView do zmiany częstotliwości odtwarzania daje płynne odtwarzanie dla wszystkich prędkości; ustawienie najpierw szybkości na 0.0, a następnie wywołanie 'prerollAtRate (atRate :, completionHandler:)' i ustawienie szybkości wysokiej w ramach procedury obsługi zakończenia nie rozwiąże problemu; utworzenie AVMutableComposition z tylko ścieżką wideo nie rozwiązuje problemu; wyłączenie ścieżki audio nie rozwiązuje problemu. – Jamborino

Odpowiedz

0

To tylko obejście.

Gdy szybkość odtwarzania zostanie zmieniona z 0,0 na dużą wartość, jeśli jest to pierwsze przejście od zera do różnej w szybkości odtwarzania od ostatniego połączenia z AVPlayer.replaceCurrentItem, odtwarzanie jest płynne (a dźwięk jest automatycznie wyciszany). Konieczne jest, aby było to przejście: jedynie ustawienie szybkości na 0.0, a następnie na pożądaną szybkość nie działa.

Tak więc, na przykład, będzie produkować płynne odtwarzanie przy wysokich prędkościach:

func setPlayerRate(player: AVPlayer, rate: Float) { 
    // AVFoundation wants us to do most things on the main queue. 
    DispatchQueue.main.async { 
     if (rate == player.rate) { 
      return 
     } 
     if (rate > 2.0 || rate < -2.0) { 
      let playerItem = player.currentItem 
      player.replaceCurrentItem(with: nil) 
      player.replaceCurrentItem(with: playerItem) 
      player.rate = rate 
     } else { 
      // No problems "out of the box" with rates in the range [-2.0,2.0]. 
      player.rate = rate 
     } 
    } 
} 
+0

Zamiana AVPlayerItem lub ponowne odtwarzanie ścieżek multimedialnych w AVComposition są poprawnymi, jeśli nie ciężkimi rękami, sposobami uzyskania płynniejszego odtwarzania. Nie są to jednak świetne rozwiązania, jeśli chcesz zezwolić użytkownikowi na zmianę częstotliwości odtwarzania podczas odtwarzania na żywo. Takie zachowanie jest powszechne w aplikacjach wideo, które mają pokrętło "jog". Introspekcja programu QuickTime Player sugeruje (choć nie jest to potwierdzone), że w przypadku niektórych szybkości odtwarzania wykonuje powtarzające się połączenia z 'seekTime ...', prawdopodobnie niewolniczymi w niestandardowej timeBase i może wykonując pewne oszustwa dekodowania/buforowania dla lepszej wydajności. – kennyc

+0

... A zmiana prędkości odtwarzania z łatwością jest rzeczywiście czymś, co chciałbym móc zrobić! Teraz, kiedy o tym wspomniałeś, stworzyłem rzecz, która pokazuje podgląd filmu w taki sam sposób, jak robi to Final Cut Pro X, gdzie po kliknięciu myszką na komórkach w arkuszu miniatur wyświetla się wideo. Czułem się sfrustrowany, że zadziałało tak dobrze, nawet podczas rzucania myszką, a to nie miało miejsca. Po prostu nie byłem wystarczająco inteligentny, aby pomyśleć o zastosowaniu metody seekTime w ten sposób. Dzięki! Spróbuję tego. Pozwoli to również obejść błąd, który może powodować utrata niektórych powiadomień podczas odtwarzania z dużą prędkością. – Jamborino

+0

Aby uzyskać małą miniaturkę wideo, którą użytkownik może przesuwać po prostu przesuwając ją w poprzek, najprawdopodobniej uzyskasz więcej niż wystarczającą wydajność, bawiąc się z czasem, którego szukasz i dopuszczalną tolerancją. Dekodowanie jest prawie natychmiastowe, jeśli szukasz "klatki kluczowej" zamiast arbitralnego czasu. Ponieważ precyzja taktowania nie jest tak istotna w podglądzie wideo, warto rozważyć masowanie czasu, w którym następuje wyszukiwanie, tak aby wypadł na klatkę kluczową lub bardzo blisko niej. Zobacz TechNote 'TN2404', aby uzyskać więcej informacji o używaniu' AVSampleCursor' do identyfikacji klatek kluczowych. – kennyc