AvurLasset se inicializa correctamente, pero a veces su AvPlayerlayer asociado solo se vuelve negro

StackOverflow https://stackoverflow.com/questions/9346347

Pregunta

Tengo una aplicación en la que el usuario puede seleccionar entre archivos de video locales. Cuando se empuja una de esas miniaturas, el usuario se presenta una nueva vista que tiene un reproductor de video personalizado que he hecho que presente el video.

Esto funciona sin problemas, pero solo algunas veces. Lo curioso es que si el usuario selecciona un nuevo video (así se presenta una nueva vista, inicializando un nuevo objeto de reproductor de video personalizado) exactamente 5 veces, el AvPlayerlayer subyacente que se usa para presentar las imágenes del reproductor se vuelve negro, aunque Parece que el activo subyacente aún se carga correctamente (la interfaz del reproductor aún contiene la duración correcta para el video, etc.).

Cuando se inicializa un nuevo objeto de reproductor multimedia personalizado (que ocurre cuando se carga el controlador de vista para los reproductores multimedia que contienen la vista), esta es la parte del método inicializador que establece el AvPlayer y su elemento asociado:

    // Start to load the specified asset
    mediaAsset = [[AVURLAsset alloc] initWithURL:contentURL options:nil];

    if (mediaAsset == nil)
        NSLog(@"The media asset is zero!!!");

    // Now we need to asynchronously load in the tracks of the specified asset (like audio and video tracks). We load them asynchronously to avoid having the entire app UI freeze while loading occours
    NSString* keyValueToLoad = @"tracks";

    // When loading the tracks asynchronously we also specify a completionHandler, which is the block of code that should be executed once the loading is either or for some reason failed
    [mediaAsset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:keyValueToLoad
                                                 ] completionHandler:^
     {
         // When this block gets executed we check for potential errors or see if the asset loaded successfully
         NSError* error = nil;

         AVKeyValueStatus trackStatus = [mediaAsset statusOfValueForKey:keyValueToLoad error:&error];

         if (error != nil)
         {
             NSLog(@"Error: %@", error.description);
         }

         //switch (trackStatus) {
             //case AVKeyValueStatusLoaded:
         if (trackStatus == AVKeyValueStatusLoaded)
         {
                 NSLog(@"Did load properly!");
                 mediaItem = [AVPlayerItem playerItemWithAsset:mediaAsset];

                if (mediaItem.error == nil)
                    NSLog(@"Everything went fine!");

                if (mediaItem == nil)
                    NSLog(@"THE MEDIA ITEM WAS NIL");

                 [mediaItem addObserver:self forKeyPath:@"status" options:0 context:&itemStatusContext];

                     mediaContentPlayer = [[AVPlayer alloc] initWithPlayerItem:mediaItem];

                         [mediaContentView setPlayer:mediaContentPlayer];

             //mediaContentView = [AVPlayerLayer playerLayerWithPlayer:mediaContentPlayer];

                [activeModeViewBlocked configurePlaybackSliderWithDuration:mediaItem.duration];

                 originalDuration = mediaItem.duration.value / mediaItem.duration.timescale;

                 // We will subscribe to a timeObserver on the player to check for the current playback time of the movie within a specified interval. Doing so will allow us to frequently update the user interface with correct information
                 playbackTimeObserver = [mediaContentPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1, 50) queue:dispatch_get_main_queue() usingBlock:^(CMTime time)
                                         {
                                             NSLog(@"TIME UPDATED!");
                                             [activeModeViewBlocked updatePlaybackSlider:time];
                                         }];

                 [self syncUI];
         }

         if (trackStatus == AVKeyValueStatusFailed)
         {
             NSLog(@"Something failed!");
         }

         if (trackStatus == AVKeyValueStatusCancelled)
         {
             NSLog(@"Something was cancelled!");
         }
     }];

Ahora, si inicializo este objeto de reproductor multimedia personalizado 5 veces exactamente, siempre comienza a representar pantallas negras.

¿Alguien tiene alguna idea de por qué esto podría estar sucediendo?

¿Fue útil?

Solución

Esto también me mordió. Hay un límite en la cantidad de reproductores de video concurrentes que Avfoundation permitirá. Ese número es cuatro (para iOS 4.x, más recientemente el número parece haber aumentado. Por ejemplo, en iOS 7 he tenido hasta ocho en una pantalla sin problemas). Es por eso que va negro en el quinto. Ni siquiera puede asumir que obtendrá cuatro, ya que otras aplicaciones pueden necesitar una 'tubería de renderizado'.

Esta API causa una tubería de renderizado:

+[AVPlayer playerWithPlayerItem:]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top