Ответ 1
Две ссылки выше действительно отвечают на мой вопрос, а пустая copyNextBufferSample
проблема с iOS SDK 5.0b3, она работает на устройстве.
Я ищу способ получить отдельные кадры видео с помощью 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. Я не понимаю, что случилось.
Две ссылки выше действительно отвечают на мой вопрос, а пустая copyNextBufferSample
проблема с iOS SDK 5.0b3, она работает на устройстве.
AVAssetImageGenerator
имеет очень слабые допуски по умолчанию для точного времени кадра, которое захватывается. Он имеет два свойства, которые определяют допуск: requestedTimeToleranceBefore
и requestedTimeToleranceAfter
. Эти допуски по умолчанию равны kCMTimePositiveInfinity
, поэтому, если вы хотите точное время, установите для них kCMTimeZero
для получения точных кадров.
(Для получения точных кадров может потребоваться больше времени, чем приблизительных фреймов, но вы утверждаете, что в реальном времени это не проблема.)
Используйте AVReaderWriter. Несмотря на то, что образец кода Apple OS X Apple, AVFoundation доступен на обеих платформах с небольшими изменениями.