Avurlasset wird richtig initialisiert, aber manchmal macht der assoziierte AvPlayerLayer nur schwarz

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

Frage

Ich habe eine Anwendung, in der der Benutzer aus lokalen Videodateien auswählen kann. Wenn einer dieser Miniaturansichten geschoben wird, wird dem Benutzer eine neue Ansicht angezeigt, die einen benutzerdefinierten Videoplayer enthält, den ich gemacht habe, der das Video präsentiert.

Dies funktioniert einwandfrei, aber nur manchmal. Das Lustige ist, dass, wenn der Benutzer ein neues Video auswählt (somit eine neue Ansicht erfolgt, genau das Fünf -mal der zugrunde liegenden AvPlayerLayer, mit dem die Grafiken aus dem Player schwarz sind, genau das fünfmalige AvPlayerLayer initialisiert, auch wenn Es scheint, als ob das zugrunde liegende Vermögenswert immer noch korrekt lädt (die Player -Schnittstelle hat immer noch die richtige Dauer für das Video und so weiter).

Wenn ein neues benutzerdefiniertes Media Player -Objekt initialisiert wird (was geschieht, wenn der Ansichtscontroller für die Medienspieler mit Ansicht geladen wird), ist dies der Teil der Initializer -Methode, der den AvPlayer und seinen zugehörigen Element festlegt:

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

Wenn ich nun dieses benutzerdefinierte Media Player -Objekt 5 -mal genau initialisiere, beginnt es immer, schwarze Bildschirme zu rendern.

Hat jemand eine Vorstellung davon, warum dies passieren könnte?

War es hilfreich?

Lösung

Das hat mich auch gebissen. Die Anzahl der gleichzeitigen Videostiere, die AvFoundation zulässt, ist begrenzt. Diese Zahl ist vier (für iOS 4.x, in jüngerer Zeit scheint die Zahl zugenommen zu haben. Zum Beispiel habe ich auf iOS 7 bis zu acht auf einem Bildschirm ohne Probleme). Deshalb wird es auf dem fünften schwarz. Sie können nicht einmal davon ausgehen, dass Sie vier erhalten, da andere Apps möglicherweise eine "Render -Pipeline" benötigen.

Diese API führt zu einer Render -Pipeline:

+[AVPlayer playerWithPlayerItem:]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top