Cambiar videos en AVPlayer crea Flash cuando se cambia

Estoy usando el AVPlayer de AVFoundation para reproducir 2 videos creados a partir de 1 video más largo (para que el final de la primera coincida con el comienzo de la segunda)

Cuando termina el primer video y el usuario toca, creo un nuevo AVPlayer y lo asigno a mi PlayerView, y empiezo a reproducir el segundo clip.

Todo funciona, sin embargo, hay una pantalla prominente "parpadeo".

Mi suposition es que esto es causado por la vista del jugador que quita el primer clip y luego muestra el segundo clip.

Lo que necesito es que este parpadeo no aparezca, por lo que ir entre los dos clips es perfecto.

¿Alguien sabe si hay una manera de detener este flickr, ya sea a través de las classs de AVPlayer *, o una manera de "falsificar" haciendo algo para que no sea visible.

Gracias

A continuación se muestra el código de mi método de carga y reproducción:

- (void)loadAssetFromFile { NSURL *fileURL = nil; switch (playingClip) { case 1: fileURL = [[NSBundle mainBundle] URLForResource:@"wh_3a" withExtension:@"mp4"]; break; case 2: fileURL = [[NSBundle mainBundle] URLForResource:@"wh_3b" withExtension:@"mp4"]; break; case 3: fileURL = [[NSBundle mainBundle] URLForResource:@"wh_3c" withExtension:@"mp4"]; break; case 4: fileURL = [[NSBundle mainBundle] URLForResource:@"wh_3d" withExtension:@"mp4"]; break; default: return; break; } AVURLAsset *asset = [AVURLAsset URLAssetWithURL:fileURL options:nil]; NSString *tracksKey = @"tracks"; [asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:tracksKey] completionHandler: ^{ // The completion block goes here. NSError *error = nil; AVKeyValueStatus status = [asset statusOfValueForKey:tracksKey error:&error]; if (status == AVKeyValueStatusLoaded) { self.playerItem = [AVPlayerItem playerItemWithAsset:asset]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemDidReachEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem]; self.player = [AVPlayer playerWithPlayerItem:playerItem]; [playerView setPlayer:player]; [self.player seekToTime:kCMTimeZero]; [self play]; } else { // Deal with the error appropriately. NSLog(@"The asset's tracks were not loaded:\n%@", [error localizedDescription]); } }]; } 

No necesita volver a crear AVPlayer para esta tarea. Puede tener varios AVPlayerItem s y luego cambiar cuál está actual a través de [AVPlayer replaceCurrentItemWithPlayerItem:item] .

Además, puede observar cuándo el artículo actual ha cambiado con el código siguiente.

  static void* CurrentItemObservationContext = &CurrentItemObservationContext; 

… Después de crear un jugador, registre al observador:

  [player1 addObserver:self forKeyPath:kCurrentItemKey options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:CurrentItemObservationContext]; 

  - (void)observeValueForKeyPath:(NSString*) path ofObject:(id)object change:(NSDictionary*)change context:(void*)context { if (context == CurrentItemObservationContext) { AVPlayerItem *item = [change objectForKey:NSKeyValueChangeNewKey]; if (item != (id)[NSNull null]) { [player1 play]; } } } 

Intenté esto y funcionó para mí.

  if (layerView1.playerLayer.superlayer) { [layerView1.playerLayer removeFromSuperlayer]; } 

Pero también estoy asignando mi propio AVPlayerLayer en lugar de usar IB para hacerlo.

Hay dos soluciones que encontré. Para mí ambos enfoques funcionaron y prefiero el segundo.

Primero, como mencionó @Alex Kennberg, crea dos sets de AVPlayerLayer y AVPlayer . y cambiarlos cuando cambie de video. Asegúrese de establecer el color de background para borrar el color.

Segundo, use UIImageView como la vista de propietario de AVPlayerLayer . Cree una image en miniatura de un video y configúrela en la vista de image antes de cambiar el video. Asegúrese de configurar el modo de vista correctamente.