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ę!
Przykro mi, ale w jaki sposób ta odpowiedź na pytanie? –
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ę. –