2011-09-09 14 views
12

Ho riscontrato qualche stranezza con MPMoviePlayerController.Perché MPMoviePlayerController setCurrentPlaybackTime passa al momento sbagliato?

Sto provando a impostare il tempo di riproduzione corrente di un video mentre è in riproduzione (origine file). Ecco un esempio di ciò che accade

  1. Play video pulsante
  2. colpo di saltare a 9,3 secondi dall'inizio del video
  3. modifiche Giochi di stato come segue:

a) Gioca state = 5 (MPMoviePlaybackStateSeekingBackward). currentPlaybackTime = 15.74 (questo è il momento in cui ho avuto modo di premere il pulsante)

b) Stato di riproduzione = 1 (MPMoviePlaybackStatePlaying). currentPlaybackTime = 7.32

Non sembra importare ciò che provo e impostare currentPlaybackTime fino a raggiungere 7.32.

Alcune informazioni aggiuntive: Ho ottenuto questo comportamento anche utilizzando i controlli integrati su MPMoviePlayerController. per esempio. Se lo faccio scorrere in avanti per 15 secondi, salta di nuovo a 7.32

Qualche idea? Ha qualcosa a che fare con il file multimediale?

+1

seeking esatta dipende dalla codifica del contenuto. Potresti ricodificare il video e forzare altri i-Frames. Ciò ridurrà il tasso di compressione ma aumenterà le possibilità di ricerca esatta. – Till

+0

Non sembra essere specifico per il contenuto. Come mai il quicktime può saltare nel punto esatto? – Ian1971

+0

Vedi sotto. Se utilizzi AVPlayer, puoi essere più specifico riguardo all'accuratezza utilizzando il metodo seekTo: toleranceBefore: toleranceAfter – Ian1971

risposta

6

È necessario cercare utilizzando seekToTime o seekToTimeWithSeconds.

CMTime npt = CMTimeMake(9,1); 
[self.player seekToTime:npt]; 

o

CMTime npt = CMTimeMakeWithSeconds(9.3, 600); 
    [self.player seekToTime:npt toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero]; 
+1

Questo non dovrebbe fare alcuna differenza - currentPlaybackTime va bene. – Till

+0

Posso confermare se passo ad AVPlayer invece ho lo stesso problema con seekToTime come faccio con currentPlaybackTime – Ian1971

+0

su ulteriori indagini c'è un altro metodo seekToTime che sembra fare il lavoro. seekToTime: toleranceBefore: toleranceAfter:. Se passi a kCMTimeZero come tolleranza, sembra che sia accurato. – Ian1971

1

cdasher mi ha segnalato nella giusta direzione, ma questo è ciò che si dovrebbe fare:

Seek utilizzando seekToTime: toleranceBefore: toleranceAfter per il campione accurata cerca. Per questo è necessario utilizzare AVPlayer non MPMediaPlayerController

CMTime npt = CMTimeMakeWithSeconds(9.3, 600); 
[self.player seekToTime:npt toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero]; 
2

Questa è una risposta in ritardo, ma ho trovato una soluzione al mio problema, che era simile. È possibile modificare la riproduzione come segue:

#define START_TIME 50.0f 
#define END_TIME START_TIME + 20.0f //play for 20 seconds 

MPMoviePlayerController *player = [self moviePlayerController]; 
[player stop]; 
[player setInitialPlaybackTime:START_TIME]; 
[player setEndPlaybackTime:END_TIME]; 
[player play]; 
+1

non funziona, è uguale alla proprietà currentPlaybackTime di stting – rakeshNS

+0

Sì, non funziona più ... hai ragione. Questo ha funzionato quando è stato originariamente pubblicato il 5 ottobre 2011. –

+4

MPMoviePlayerController è la peggiore API di Apple. È così orribilmente buggy. L'impostazione del tempo di riproduzione iniziale e la fine del tempo di riproduzione funzionano solo la prima volta dopo l'avvio. Una volta che inizia a giocare, se voglio fermarlo e ricominciare dallo stesso punto, devo allocare/init una nuova istanza per farlo funzionare. Ho perso innumerevoli ore sul suo serraglio di insetti. – n8tr

Problemi correlati