Управление предварительной буферизацией элементов в avqueueplayer - PullRequest
4 голосов
/ 12 сентября 2011

Может, кто-нибудь подскажет, есть ли способ выборочной предварительной буферизации элементов avplayeritems в массиве AVQueuePlayer, вместо того, чтобы оставить его на автоматическом способе AVQueuePlayer загрузки только следующего элемента по окончании первого элементаиграть.

Я загружаю последовательность из 4 коротких видеоклипов, и я хотел бы предварительно их кэшировать, прежде чем сказать AVQueuePlayer, что нужно воспроизвести массив.Есть ли на самом деле способ попасть под прицел avqueueplayer и контролировать предварительную буферизацию по желанию?

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

Вы можете сделать это с помощью mpmovieplayer, вызвав [player prepareToPlay];, который вручную запускает загрузку каждого видеофайла, который вы хотите, а затемВы можете проверить завершение загрузки, наблюдая за уведомлением mpmovieplayerLoadstateDidChange и проверяя значение loadState, чтобы убедиться, что оно полностью загружено, а затем указав mpmovieplayer на воспроизведение.Как вы можете эффективно сделать подобное с AVQueuePlayer?

Возможно ли это, или я обнаружил один из главных недостатков AVQueuePlayer?


Хорошее предложение сplayerObserver Стивен, но нужно что-то вроде того, чтобы вы могли явно загружать отдельные элементы в память и затем указывать AVQueuePlayer 'не воспроизводить первый элемент в массиве, пока ВСЕ элементы в массивезагружаются в память 'В настоящее время, кажется, нет никакого способа запустить даже второй элемент в загрузке массива, пока первый не подходит к концу!

Как отдельная проблема, я также заметил некоторыестранность в AVQueuePlayer, где, если вы загружаете два одинаковых исходных видеофайла в массив (оба ссылаются как два совершенно отдельных AVPlayerItems, как вы должны делать), когда вы проигрываете видеоклипы в массиве на всем протяжении,в первый раз клип воспроизводится нормально, но когда дело доходит до воспроизведения того же самого клипа снова (как отдельный AVPlayerItem), он воспроизводит очень быстродо определенной точки в видео, затем, наконец, начинает воспроизводиться с нормальной скоростью оттуда.

Кто-нибудь еще заметил это поведение?

Ответы [ 2 ]

6 голосов
/ 10 апреля 2013

Служба поддержки разработчиков Apple только что подтвердила мне, что AVQueuePlayer не буферизует элементы видео.

0 голосов
/ 21 сентября 2011

У меня такой же вопрос. Мне бы хотелось, чтобы у AV Foundation было что-то вроде уведомления о полностью загруженном ресурсе.

Следующий код может частично решить проблему:

Float64 durationSeconds = CMTimeGetSeconds([<#An asset#> duration]);
CMTime secondThird = CMTimeMakeWithSeconds(durationSeconds*2.0/3.0, 1);
NSArray *times = [NSArray arrayWithObjects:[NSValue valueWithCMTime:secondThird], nil];

self.playerObserver = [<#A player#> addBoundaryTimeObserverForTimes:times queue:NULL usingBlock:^{
}];
...