Avurallasset становится инициализируется правильно, но иногда его связанный с ними AvPlayerLayer просто Rends Black

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

Вопрос

У меня есть приложение, в котором пользователь может выбрать из локальных видеофайлов. Когда одна из этих миниатюр настаивается, пользователю представлено новое представление, в котором есть пользовательский видеоплеер, который я сделал, который представляет видео.

Это работает безупречно, но только иногда. Анкет Самое смешное, что если пользователь выбирает новое видео (таким образом, получение нового представления, инициализация нового пользовательского объекта видеоплеера) ровно 5 раз, базовый AvPlayerLayer, который используется для представления визуальных эффектов от игрока, рендерирует черным, даже если Кажется, что базовый актив все еще загружается правильно (интерфейс игрока по -прежнему сохраняет правильную продолжительность для видео и т. Д.).

Когда новый Media Player объект Media Player (который происходит, когда контроллер представления для медиаплееров, содержащих представление, загружается), это является частью метода инициализатора, который устанавливает AvPlayer и связанный с ним элемент:

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

Теперь, если я точно инициализую этот пользовательский объект медиаплеерного игрока 5 раз, он всегда начинает отображать черные экраны.

У кого -нибудь есть представление о том, почему это может произойти?

Это было полезно?

Решение

Это тоже меня укусило. Существует ограничение на количество одновременных видеоплееров, которые позволит AvFoundation. Это число составляет четыре (для iOS 4.x, в последнее время число, по -видимому, увеличилось. Например, на iOS 7 у меня было до восьми на одном экране без проблем). Вот почему он становится черным на пятом. Вы даже не можете предположить, что получите четыре, так как другим приложениям может понадобиться «рендеринговый конвейер».

Этот API вызывает рендеринговый трубопровод:

+[AVPlayer playerWithPlayerItem:]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top