El almacenamiento en búfer de AVPlayer, la pausa en la notificación y el marco del póster.

Tengo algunas preguntas relacionadas con AVPlayer que son:

  1. Cuando hacemos una pausa en AVPlayer través de [player pause] ¿ AVPlayer mantiene el almacenamiento en búfer del video de la networking o simplemente se detiene? No pude get ninguna información relacionada con esto en la documentation de Apple. Además, ¿es posible obligar a AVPlayer a mantener el almacenamiento en búfer mientras se encuentra en pausa, de modo que si tenemos el video pausado en espera de que finalice el primer video, no encontraríamos ninguna brecha entre los videos?

  2. Al pausar el AVPlayer , podemos tener cualquier evento en [player pause] .

  3. ¿Podemos mostrar image AVPlayer en AVPlayer por unos segundos?

Gracias

1) AVPlayer almacenará el video en varios casos, ninguno está documentado. Diría que puede esperar almacenamiento en búfer cuando inicia el video y cuando reemplaza el elemento actual. Puede observar currentItem.loadedTimeRanges para saber qué está sucediendo. Esa propiedad le dirá qué ranges de time de video se han cargado.

Además, hay algunas otras properties de currentItem que pueden ayudarlo a: playbackLikelyToKeepUp , playbackBufferFull y playbackBufferEmpty .

Lograr una reproducción sin interrupciones perfecta no es fácil.

 /* player is an instance of AVPlayer */ [player addObserver:self forKeyPath:@"currentItem.loadedTimeRanges" options:NSKeyValueObservingOptionNew context:kTimeRangesKVO]; 

En observeValueForKeyPath:ofObject:change:context: ::

 if (kTimeRangesKVO == context) { NSArray *timeRanges = (NSArray *)[change objectForKey:NSKeyValueChangeNewKey]; if (timeRanges && [timeRanges count]) { CMTimeRange timerange = [[timeRanges objectAtIndex:0] CMTimeRangeValue]; NSLog(@" . . . %.5f -> %.5f", CMTimeGetSeconds(timerange.start), CMTimeGetSeconds(CMTimeAdd(timerange.start, timerange.duration))); } } 

2) Solo mantente atento a player.rate .

 [player addObserver:self forKeyPath:@"rate" options:NSKeyValueObservingOptionNew context:kRateDidChangeKVO]; 

Luego, en su observeValueForKeyPath:ofObject:change:context: ::

  if (kRateDidChangeKVO == context) { NSLog(@"Player playback rate changed: %.5f", player.rate); if (player.rate == 0.0) { NSLog(@" . . . PAUSED (or just started)"); } } 

3) Puede build una película de una longitud determinada usando una image fija, pero es más fácil usar una UIImageView regular en la parte superior del reproductor. Ocultar / mostrar cuando sea necesario.

Proyecto de muestra : no dude en jugar con el código que escribí para respaldar mi respuesta .