Кадровая синхронизация с AVPlayer - PullRequest
6 голосов
/ 04 февраля 2012

У меня проблема с синхронизацией внешнего контента в CALayer с AVPlayer с высокой точностью.

Моей первой мыслью было расположение массива кадров (равное количеству кадров в видео) в пределах CAKeyframeAnimation и синхронизация с AVSynchronizedLayer.Тем не менее, после пошагового перехода к видео, кажется, что AVPlayer и Core Animation перерисовываются на разных циклах, поскольку между ними существует небольшая (но заметная) задержка перед синхронизацией.

Если не считать обработку и отображение через Core Video, есть ли способ точной синхронизации с AVPlayer на уровне кадра?

Обновление: 5 февраля 2012 года

На данный момент лучший способ сделать это - сделать предварительный рендеринг через AVAssetExportSession в сочетании с AVVideoCompositionCoreAnimationTool и CAKeyFrameAnimation.

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

Ответы [ 2 ]

3 голосов
/ 24 апреля 2012

Что вы подразумеваете под «высокой точностью»?

Хотя в документах утверждается, что AVAssetReader не предназначен для использования в реальном времени, на практике у меня не было проблем с чтением видео в реальном времени с его использованием (см. https://stackoverflow.com/a/4216161/42961). Возвращенные кадрыпоставляются с «меткой времени представления», которую вы можете получить с помощью CMSampleBufferGetPresentationTimeStamp.

. Вы захотите, чтобы одна часть проекта была здесь «основной» хронометрист.и не включает в себя потенциально блокирующие вещи, такие как доступ к диску, я бы использовал его в качестве источника основного времени. Когда вам нужно нарисовать контент (например, в селекторе draw в вашем подклассе UIView), вы должны прочитать currentTimeиз анимации CALayer, если необходимо, перейдите к видеокадрам AVAssetReader, используя copyNextSampleBuffer, пока CMSampleBufferGetPresentationTimeStamp не вернет> = currentTime, нарисуйте кадр и затем нарисуйте содержимое анимации CALayer поверх.1018 *

1 голос
/ 23 февраля 2013

Если ваш плеер использует AVURLAsset, вы загрузили его с установленным флагом точной продолжительности?Т.е. что-то вроде:

NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey];
AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:aUrl options:options];
...