Question

J'ai une application dans laquelle l'utilisateur peut sélectionner des fichiers vidéo locaux. Lorsque l'une de ces vignettes est poussé, l'utilisateur est présenté une nouvelle vue qui ont un lecteur vidéo personnalisé, je l'ai fait que présente la vidéo.

Cela fonctionne parfaitement, mais seulement parfois . Le plus drôle est que si l'utilisateur sélectionne une nouvelle vidéo (ainsi se présente une nouvelle vue, l'initialisation d'un nouvel objet lecteur vidéo personnalisé) exactement 5 fois, le AVPlayerLayer sous-jacente qui est utilisée pour présenter les visuels du joueur rend noir, même si il semble que l'actif sous-jacent des charges encore correctement (l'interface du lecteur détient toujours la durée correcte pour la vidéo et ainsi de suite).

Quand un nouvel objet lecteur multimédia personnalisé s'initialisé (ce qui se produit lorsque le contrôleur d'affichage pour les lecteurs multimédias contenant vue se charge), c'est la partie de la méthode d'initialisation qui met en place le AVPlayer et son élément associé:

    // 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!");
         }
     }];

Maintenant, si j'initialiser ce lecteur média objet personnalisé 5 fois exactement, il commence toujours à rendre les écrans noirs.

Est-ce que quelqu'un a une idée des raisons pour lesquelles cela pourrait se produire?

Était-ce utile?

La solution

Ce bit moi aussi. Il y a une limite sur le nombre de lecteurs vidéo simultanées AVFoundation permettent. Ce nombre est de quatre (pour iOS 4.x, plus récemment, le nombre semble avoir augmenté. Par exemple, sur iOS 7 J'ai eu jusqu'à huit sur un écran sans problème). Voilà pourquoi il va noir sur le cinquième. Vous ne pouvez même supposer que vous aurez quatre, que d'autres applications peuvent avoir besoin d'un « pipeline render ».

Cette API provoque un pipeline rendu:

+[AVPlayer playerWithPlayerItem:]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top