2013-01-05 14 views
10

używam AVPlayera w aplikacji Cocoa, a zaimplementowałem polecenie, które przeskakuje na koniec wideo.Szukając dokładnie, w przeciwieństwie do dwóch sekund krótkich, w AVPlayer

Problem polega na tym, że AVPlayer nie szuka miejsca, do którego je wysłałem.

Na przykład jeden z filmów, które mam, ma 4 minuty i 14 sekund. Kiedy próbuję do końca, AVPlayer dąży do 4 minut i 12 sekund - dwie sekundy krótkie. Jeśli następnie uderzę, odtwarzacz zagra na dwie sekundy, , a następnie osiągnie koniec.

Moja pierwsza próba była to:

[self.player seekToTime:self.player.currentItem.duration]; 

mam włączone go do tego:

[self.player seekToTime:self.player.currentItem.duration 
     toleranceBefore:kCMTimePositiveInfinity 
     toleranceAfter:kCMTimeZero]; 

Ani jeden działa lepiej niż inne.

Próbowałem również staram się uzyskać kCMTimePositiveInfinity. Po prostu wtedy mnie zignorował.

Wygląda na to, że odtwarzacz nie wczytał jeszcze tej części wideo. Mogę nawet dążyć do niezupełnie końca, przejść do prawdziwego celu, a następnie spróbować ponownie dotrzeć do końca, a on wróci do niezupełnie końca.

Niedobór nie zawsze wynosi dwie sekundy. W niektórych moich filmach działa mniej więcej dokładnie poprawnie, skacząc bardzo blisko prawdziwego końca, jeśli nie do końca. Co najmniej jeden, trwa krótko trzy sekundy. Długość nie wydaje się być czynnikiem; wszystkie z nich są mniej więcej tej samej długości, z wyjątkiem jednej, która trwa ponad godzinę i ma krótki okres dwóch sekund.

Dlaczego więc odtwarzacz AVPlayer skacze aż o trzy sekundy krótszy od miejsca, w którym mu kazałem i jak mogę go przekonać, aby przeskoczył do momentu, w którym prosiłem?

Odpowiedz

20

Źle zrozumiałem tolerancje i cofnąłem je.

Każda tolerancja określa, jak daleko w tym kierunku AVPlayer może oddalić się od żądanego czasu. Tak więc, przekazanie pozytywnej nieskończoności dla toleranceBefore mówi "możesz być tak wcześnie, jak tylko chcesz", a przekazanie zera dla toleranceAfter mówi "po prostu nie spóźnij się" (co byłoby miłym trikiem podczas poszukiwania do końca).

Zatem rozwiązaniem jest przełączanie wartości:

[self.player seekToTime:self.player.currentItem.duration 
     toleranceBefore:kCMTimeZero 
     toleranceAfter:kCMTimePositiveInfinity]; 

Lub, w języku angielskim: „Nie bądź wcześnie, ale można być tak późno, jak chcesz.”

+0

Ustawienie kCMTimePositiveInfinity pomogło mi również uniknąć tego małego ruchu wstecz suwaka podczas wyszukiwania. –

+0

Po prostu niesamowite! –

1

Oto szybka wersja odpowiedzi przez @Peter Hosey:

self.player.seekToTime(self.player.currentItem.duration, 
      toleranceBefore: kCMTimeZero, 
      toleranceAfter: kCMTimePositiveInfinity)