2012-07-13 10 views
27

Mam odtwarzacz AVP, który odtwarza strumień wideo HLS. Mój interfejs użytkownika zawiera rząd przycisków, po jednym dla każdego "rozdziału" wideo (przyciski oznaczone są "1", "2", "3"). Aplikacja pobiera niektóre metadane z serwera zawierającego listę punktów podziału rozdziałów w sekundach. Na przykład jeden film ma 12 minut - lista rozdziałów w punktach to 0, 58, 71, 230, 530 itd., Itd.Funkcja AVTlayer seekToTime nie odtwarza się w prawidłowej pozycji

Gdy użytkownik dotknie jednego z "przycisków rozdziałów" Kod ten ma przycisk obsługi:

  [self.avPlayer pause]; 

    [self.avPlayer seekToTime: CMTimeMakeWithSeconds(seekTime, 600) 
       toleranceBefore: kCMTimeZero 
       toleranceAfter: kCMTimeZero 
      completionHandler: ^(BOOL finished) 
      { 
       [self.avPlayer play]; 
      }]; 

gdzie „seekTime” jest lokalna zmienna, która zawiera niższe od punktu (jak opisano powyżej).

Problem polega na tym, że wideo nie zawsze zaczyna się we właściwym miejscu. Czasami tak się dzieje. Czasami jednak trwa to od jednej dziesiątej sekundy do 2 sekund PRZED żądanym czasem szukania. NIGDY nie zaczyna się po żądanym czasie poszukiwań.

Oto niektóre statystyki dotyczące kodowania wideo:

Encoder: handbrakeCLI Codec: H.264 Frame rate: 24 (faktycznie, 23.976 - tak samo jak w jaki sposób został on zastrzelony) Video Bitrate: wiele bitrate (64/150/300/500/800/1200) audio Bitrate: 128K Klatki kluczowe: 23,976 (1 na sekundę)

Używam narzędzie firmy Apple mediafilesegmenter, oczywiście, i variantplaylistcreator do generowania listy odtwarzania.

Pliki są dostarczane z zasobnika Amazon Cloud/S3.

Jednym z obszarów, o których nie wiem, jest CMTimeMakeWithSeconds. Na przykład, w powyższym fragmencie Używam:

CMTimeMakeWithSeconds (seekTime, 600)

Próbowałem również:

CMTimeMakeWithSeconds (seekTime, 1)

nie mogę powiedzieć, który jest poprawne, chociaż OBU wydają się powodować te same niespójne wyniki!

Próbowałem również:

CMTimeMakeWithSeconds (seekTime, 23,967)

Niektóre artykuły zastrzeżenia to działa jak licznik/denomenator, więc n/1 powinny być poprawne, gdzie 'n' jest liczbą sekund (jak w CMTimeMakeWithseconds (n, 1)). Ale kod został pierwotnie stworzony przez innego programistę (którego już nie ma) i użył numeru 600 dla parametru preferredTimeScale (tj. CMTimeMakeWithseconds (n, 600)).

Czy ktoś może podać jakieś wskazówki, co robię źle, a nawet jeśli rodzaj dokładności, który próbuję osiągnąć, jest nawet możliwy?

Jeśli ktoś ma ochotę zaoferować "alternatywne" rozwiązania, rozważamy już podzielenie go na osobne strumienie, po jednym na rozdział, ale nie wierzymy, że da nam to samo wrażenie w tym sensie, że zmiana rozdziały będą trwały dłużej, ponieważ nowy AVPlayerItem będzie musiał zostać utworzony i załadowany, itd. itp. itp.Jeśli uważasz, że to jedyne rozwiązanie, które zadziała (i spodziewamy się, że to pozwoli osiągnąć pożądany rezultat - tj. Każdy rozdział rozpocznie się dokładnie tam, gdzie chcemy), możesz to powiedzieć.

Z góry dziękuję!

Odpowiedz

2

użyj funkcji takich jak [player seekToTime:CMTimeMakeWithSeconds(seekTime,1)].
Ponieważ twoja wartość tolerancji kCMTimeZero będzie wymagać więcej czasu na szukanie. Zamiast używać wartości tolerancji kCMTimeZero możesz użyć kCMTimeIndefinite, która jest odpowiednikiem funkcji, którą wcześniej podałem.

+0

Przykro mi, ale w jaki sposób ta odpowiedź na pytanie? –

+1

Niepoprawnie. Skala czasowa wynosząca 1 oznacza, że ​​możesz określić tylko całe sekundy, których chcesz szukać. Skala czasowa to liczba części na sekundę. Użyj 600 na wideo, jak zaleca Apple, ponieważ jest to produkt z typowych szybkości klatek wideo, takich jak 50, 60, 25 i 24 klatek na sekundę. –

3

Moja sugestia: 1) Nie używaj [avplayer seekToTime: toleranceBefore: toleranceAfter:], to opóźni twój czas wyszukiwania 4-5 sekund.

2) Film wideo HLS został skrócony do 10 sekund na segment. Twoja pozycja początkowa rozdziału powinna pasować do wartości, która jest wielokrotnością 10. Ponieważ segment zaczyna się od klatki, w ten sposób możesz uzyskać szybki czas wyszukiwania i dokładny czas.

+7

Jeśli nie używasz '[avplayer seekToTime: toleranceBefore: toleranceAfter:]' to jaka metoda powinna być użyta? – Fennelouski

+1

Nie zgadzam się z tym. Pytanie brzmi: "AVTlayer seekToTime nie gra na właściwej pozycji". Dodając wartość tolerancji Przed rozpoczęciem: tolerancja Po ustawieniu parametrów seekToTime() na kCMTimeZero, rozwiążesz ten problem, dlatego jest to poprawna odpowiedź na pytanie. Jeśli tego nie zrobisz, jest to dowolne miejsce, w którym rozpoczyna się gracz. – Bocaxica

+0

Dzięki za wskazanie tego, rozwiązałem problem Lag z alternatywną metodą. –

76
int32_t timeScale = self.player.currentItem.asset.duration.timescale; 
CMTime time = CMTimeMakeWithSeconds(77.000000, timeScale); 
[self.player seekToTime:time toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero]; 

Miałem problem z "seekToTime". Rozwiązałem mój problem za pomocą tego kodu. "Skala czasowa" to podstęp dla tego problemu.

+6

@ jordan-bigel należy wybrać jako poprawną odpowiedź. –

+0

fajne rozwiązanie @Muhmd –

+0

Dzięki stary, uratował mój jeden dzień, –

0

Po wprowadzeniu tego kodu może to rozwiązać problem.

let targetTime = CMTimeMakeWithSeconds(videoLastDuration, 1) // videoLastDuration hold the previous video state. 
self.playerController.player?.currentItem?.seekToTime(targetTime, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero) 
Powiązane problemy