2013-01-05 9 views
10

Uso AVPlayer in un'app Cocoa e ho implementato un comando che salta alla fine del video.Ricerca accurata, al contrario di due secondi, in AVPlayer

Il problema è che AVPlayer non cerca dove l'ho detto.

Ad esempio, uno dei video che ho è lungo 4 minuti e 14 secondi. Quando cerco la fine, AVPlayer cerca 4 minuti e 12 secondi, due secondi in meno. Se poi premo play, il lettore giocherà per due secondi, quindi raggiungere la fine.

Il mio primo tentativo è stato questo:

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

sono passato a questo:

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

Né si lavora meglio rispetto agli altri.

Ho anche provato a cercare su kCMTimePositiveInfinity. Mi ha semplicemente ignorato allora.

Non sembra importare se il giocatore abbia già caricato quella parte del video. Posso anche cercare il non-fine-fine, giocare fino alla fine vera, quindi provare di nuovo a cercare fino alla fine, e tornerà al non-fine-fine.

Il deficit non è sempre di due secondi. Su alcuni dei miei video, funziona più o meno esattamente correttamente, saltando molto vicino al vero fine se non esattamente ad esso. Su almeno uno, si riduce a tre secondi. La lunghezza non sembra essere un fattore; tutti questi sono circa della stessa lunghezza, tranne uno, che dura più di un'ora e cerca due secondi più corti.

Quindi, perché AVPlayer è in grado di saltare fino a tre secondi rispetto a dove l'ho detto, e come posso convincerlo a saltare al momento in cui ho richiesto?

risposta

20

Ho frainteso le tolleranze e le ho fatte all'indietro.

Ciascuna tolleranza indica la distanza in cui AVPlayer è in grado di allontanarsi dal tempo richiesto. Quindi, passando infinito positivo per toleranceBefore si sta dicendo "puoi essere il più presto possibile", e passare zero per toleranceAfter sta dicendo "solo non essere in ritardo" (che sarebbe un trucco accurato quando si cerca fino alla fine).

Così, la soluzione è quella di cambiare i valori:

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

Oppure, in inglese: “Non essere in anticipo, ma si può essere più tardi che si desidera.”

+0

impostazione kCMTimePositiveInfinity mi ha aiutato anche per evitare questo piccolo spostamento all'indietro del cursore quando si cerca. –

+0

Semplicemente fantastico! –

1

Ecco un versione rapida della risposta da @Peter Hosey:

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