iOS Video: возможно более 4 одновременных AVAssetReader? - PullRequest
3 голосов
/ 19 мая 2011

Я бы хотел сделать несколько видео в формате H264 mp4 одновременно для нескольких просмотров. Цель состоит в том, чтобы прочитать около 8 коротких видеороликов, каждое размером 100x100 пикселей, и позволить им одновременно отображать свой контент в нескольких местах на экране.

Представьте себе 24 квадрата на экране, каждый из которых показывает одно видео из пула из 8 видео.

MoviePlayer не работает, поскольку он показывает только одно полноэкранное видео. AVPlayer с несколькими слоями AVPlayerLayers ограничен, потому что только последний созданный слой будет отображать его содержимое на экране (согласно документации и моему тестированию).

Итак, я написал короткий класс видео и создал экземпляр для каждого файла .mp4 в моем пакете, используя AVAssetReader для чтения его содержимого. При обновлении каждый видеокадр извлекается, преобразуется в UIImage и отображается в соответствии с частотой кадров видео. Кроме того, эти изображения кэшируются для быстрого доступа к циклу.

- (id) initWithAsset:(AVURLAsset*)asset withTrack:(AVAssetTrack*)track
{
    self = [super init];
    if (self)
    {
        NSDictionary* settings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA], (NSString*)kCVPixelBufferPixelFormatTypeKey, nil];

        mOutput = [[AVAssetReaderTrackOutput alloc] initWithTrack:track outputSettings:settings];
        mReader = [[AVAssetReader alloc] initWithAsset:asset error:nil];

        [mReader addOutput:mOutput];

        BOOL status = [mReader startReading];
    }

    return self;
}


- (void) update:(double)elapsed
{
  CMSampleBufferRef buffer = [mOutput copyNextSampleBuffer];

  if (buffer) 
  {
    UIImage* image = [self imageFromSampleBuffer:sampleBuffer];
  }

  [...]
}

На самом деле это работает довольно хорошо, но только для 4 видео. Пятый никогда не появляется. Сначала я подумал о проблемах с памятью, но я протестировал его на следующих устройствах:

  • iPhone 3GS
  • iPhone 4
  • iPad
  • iPad 2

У меня было одинаковое поведение на каждом устройстве: 4 видео воспроизводились плавно, без различий

Если бы это была проблема с памятью, я бы ожидал, что по крайней мере либо iPad 2 покажет 5 или 6 видео (из-за более качественного оборудования), либо 3GS покажет только 1, либо где-нибудь произойдет сбой.

Симулятор показывает все видео.

Отладка на устройстве показывает, что

BOOL status = [mReader startReading]; 

возвращает false для видео 5,6,7 и 8.

Итак, есть ли какая-то аппаратная настройка (или ограничение), которая не допускает более 4 AVAssetReaders одновременно? Потому что я не могу объяснить это поведение. Я не думаю, что все устройства имеют одинаковый объем видеопамяти.

Ответы [ 3 ]

2 голосов
/ 17 июня 2013

Да, в iOS установлен верхний предел количества видео, которые можно декодировать за один раз.Хотя ваш подход хорош, я не знаю способа обойти этот верхний предел, если одновременно активировать столько декодеров h.264.Если вы заинтересованы, пожалуйста, посмотрите на мое решение этой проблемы, это проект xcode под названием Fireworks .По сути, эта демонстрация показывает декодирование группы видео с альфа-каналом на диск, затем каждое из них воспроизводится путем сопоставления части видеофайлов в память.Такой подход позволяет декодировать более 4 фильмов одновременно без использования всей системной памяти и без жесткого ограничения количества объектов декодера h.264.

0 голосов
/ 08 июня 2016

Вот моя последняя итерация совершенно гладко прокручиваемого представления коллекции с предварительным просмотром видео в реальном времени (до 16 одновременно):

https://youtu.be/7QlaO7WxjGg

В нем даже используется обложкаПоток пользовательский макет и «отражение» вид, который отлично отражает предварительный просмотр видео.Исходный код здесь:

http://www.mediafire.com/download/ivecygnlhqxwynr/VideoWallCollectionView.zip

0 голосов
/ 28 декабря 2011

Вы пытались создать отдельные AVPlayerItems на основе одного и того же AVAsset для каждого AVPlayerLayer?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...