Чтение видео по кадру под iOS

Я ищу способ получить отдельные кадры видео с помощью API iOS. Я попытался использовать AVAssetImageGenerator, но, похоже, он обеспечивает только кадр до ближайшей секунды, что слишком грубо для моего использования.

Из того, что я понимаю в документации, конвейер AVAssetReader, AVAssetReaderOutput и CMSampleBufferGetImageBuffer, я должен что-то сделать, но я застрял с CVImageBufferRef. С этим я ищу способ получить CGImageRef или UIImage, но не нашел его.

В реальном времени не требуется, и чем больше я могу придерживаться предоставленного API, тем лучше.

Спасибо большое!

Изменить: На этом сайте: http://www.7twenty7.com/blog/2010/11/video-processing-with-av-foundation и этот вопрос: как преобразовать CVImageBufferRef в UIImage Я приближаюсь к решению. Проблема: AVAssetReader перестает читать после первого copyNextSampleBuffer, не давая мне ничего (sampleBuffer - NULL).

Видео доступно для чтения MPMoviePlayerController. Я не понимаю, что случилось.

Ответ 1

Две ссылки выше действительно отвечают на мой вопрос, а пустая copyNextBufferSample проблема с iOS SDK 5.0b3, она работает на устройстве.

Ответ 2

AVAssetImageGenerator имеет очень слабые допуски по умолчанию для точного времени кадра, которое захватывается. Он имеет два свойства, которые определяют допуск: requestedTimeToleranceBefore и requestedTimeToleranceAfter. Эти допуски по умолчанию равны kCMTimePositiveInfinity, поэтому, если вы хотите точное время, установите для них kCMTimeZero для получения точных кадров.

(Для получения точных кадров может потребоваться больше времени, чем приблизительных фреймов, но вы утверждаете, что в реальном времени это не проблема.)

Ответ 3

Используйте AVReaderWriter. Несмотря на то, что образец кода Apple OS X Apple, AVFoundation доступен на обеих платформах с небольшими изменениями.