Использование ATPagingView (ScrollView) для отображения нескольких страниц, но некоторые из них отображаются пустыми, если я выхожу и возвращаюсь в - PullRequest
0 голосов
/ 23 октября 2011

Поэтому я настроил ATPagingView (ScrollView) (https://github.com/andreyvit/SoloComponents-iOS/tree/master/ATPagingView) с настраиваемым PageView для каждой страницы. Представление страницы загружается с помощью AVPlayerLayer, который был / загружен с помощью AVPlayer (потому что это было частью попытки чтобы исправить это, я попытался использовать AVQueuePlayer.) Теперь в ATPagingView была встроена переработка страниц, так что мне не нужно загружать все 15 видео одновременно (установите 3), и я добавил функцию перезагрузки в PageView, которая в основном загружает видео для нового индекса страницы, не перезапуская все, но прежде чем я просто переинициализировал все, и это все еще не работало. Я довольно уверен, что это проблема памяти с avplayer, но профилировщик не показывает утечки и постоянный объем памяти. Я теперь, когда ATPagingView отправляет правильный индекс и все, потому что у меня также есть метки на PageViews, которые являются правильными.

Я пробовал это: Воспроизведение множества различных видео на iphone с использованием AVPlayer без удачи. А также пытаясь использовать AVQueuePlayers для обработки перезагрузки вместо replaceCurrentItemWithPlayerItem :. Опять не повезло.

Вот примерный код инициализации:

    NSURL* m =[[NSBundle mainBundle] URLForResource:page.video withExtension:page.videoExt];


        self.player = [AVQueuePlayer queuePlayerWithItems:[NSArray arrayWithObject:[AVPlayerItem playerItemWithURL:m]]];
        self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];

        self.playerLayer.frame = self.frame;
        [img.layer addSublayer: self.playerLayer];
        self.player.actionAtItemEnd = AVPlayerActionAtItemEndNone; 

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(playerItemDidReachEnd:)
                                                     name:AVPlayerItemDidPlayToEndTimeNotification
                                                   object:[self.player currentItem]];
        [self.player play];

И код перезагрузки выглядит примерно так:

    [[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:[self.player currentItem]];
[self.player removeAllItems];

        NSURL* m =[[NSBundle mainBundle] URLForResource:page.video withExtension:page.videoExt];

        //AVPlayer version
        url = m;
        AVAsset *newAsset = [AVURLAsset URLAssetWithURL:url options:nil];
        AVPlayerItem *newPlayerItem = [AVPlayerItem playerItemWithAsset:newAsset];
        [self.player insertItem:newPlayerItem afterItem:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(playerItemDidReachEnd:)
                                             name:AVPlayerItemDidPlayToEndTimeNotification
                                           object:newPlayerItem];
        [self.player play];

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

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2011

Хотя это исправило это приложение, новое, над которым я работаю, почти необходимо, чтобы у меня было несколько контроллеров игроков. Я использую блок для загрузки актива (подтверждая, что актив загружен) и наблюдателя для статуса ReadyToPlay на игроке. Кроме того, я убедился, что суперслой слоя avplayerlayer не равен нулю и что он был последним игроком, загруженным в это представление. После этого все реже, когда приложение по возможности перезагружает их с новыми носителями (снова используя блоки и обозреватель), но бывают моменты, когда я переключаюсь на контроллер проигрывателя, и на нем будет пустое место, где находится фильм должно быть. (сообщает, что актив загружен, а слой avplayerlayer не имеет суперслоя, а метаданные фильма правильные). Действительно потерянный на этом. Есть идеи?!

Спасибо, Матф

0 голосов
/ 01 ноября 2011

Я изменил загрузчик, чтобы не предварительно кэшировать представления, и это исправило это!Выпущен на рынок сейчас ^^

...