2012-05-18 10 views
15

Tengo algunas preguntas relacionadas con AVPlayer que son:AVPlayer de amortiguación, la notificación de una pausa, y cartel del marco de

  1. Cuando nos detenemos la AVPlayer través [player pause] hace el AVPlayer mantener amortiguar el vídeo de la red o solo ¿detener? No pude obtener ninguna información relacionada con esto en la documentación de Apple. Además, ¿es posible forzar al AVPlayer a mantener el almacenamiento en búfer mientras está en pausa, de modo que si tenemos el video en pausa esperando que termine el primer video, entonces no encontraríamos ningún espacio entre los videos?

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

  3. ¿Podemos mostrar imágenes fijas en AVPlayer durante algunos segundos?

Gracias

+0

Eche un vistazo a AVQueuePlayer para la reproducción secuencial sin espacios múltiples. – MikeyWard

+0

Utilizado ya, no maneja el contenido de audio/video transmitido, lo he hecho ya usando AVPlayer. Gracias –

+0

@OmerWaqasKhan Use Charles para observar el paquete de red de su aplicación, y puede ver que ese jugador aún envía solicitudes de red cuando está en pausa – onmyway133

Respuesta

35

1) AVPlayer se amortiguar el video en varios casos, ninguno Cleary documentado. Diría que puede esperar almacenamiento en búfer cuando inicie el video y cuando reemplace el elemento actual. Puede observar currentItem.loadedTimeRanges para saber qué está pasando. Esa propiedad le indicará qué rangos de tiempo de video se han cargado.

Además, hay algunas otras propiedades de currentItem que pueden ayudarle: playbackLikelyToKeepUp, playbackBufferFull y playbackBufferEmpty.

Lograr una reproducción perfecta sin gapless 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) Sólo mantener un ojo en 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 a movie of a given length using a still image pero es más fácil de usar un habitual UIImageView en la parte superior del reproductor. Ocultar/mostrar cuando sea necesario.

Proyecto de ejemplo: dude en jugar con the code I wrote to support my answer.

+1

thanx madmw, y podemos forzar al avplayer a mantener el almacenamiento en búfer en estado de pausa? –

+0

AFAIK no hay una API pública para trabajar con el búfer de AVPlayer.Si desea mantener el almacenamiento en búfer más allá del punto de pausa, puede simular la pausa: seguir reproduciendo sin volumen y con la vista oculta, luego use seekToTime para reanudar la reproducción. – djromero

+0

¡Gracias por esto! Un ejemplo concreto ayudó mucho. – user2734823

Cuestiones relacionadas