2013-10-24 8 views
0

У меня есть приложение, которое должно отображать кадры из видео/фильма в CGBitmapContext с произвольным CGAffineTransform. Я бы хотел, чтобы у него была нормальная частота кадров, как минимум 20 кадров в секунду.Рисование кадров из фильма в CGBitmapContext

Я пробовал использовать AVURLAsset и [AVAssetImageGenerator copyCGImageAtTime:], и, поскольку документация для этого метода четко заявляет, что он довольно медленный, иногда меня снижают до 5fps.

Что такое лучший способ сделать это? Я ДУМАЮ, что я могу настроить AVPlayer с AVPlayerLayer, а затем использовать [CGLayer renderInContext:] с моим преобразованием. Будет ли это работать? Или, возможно, AVPlayerLayer не запускается, когда он замечает, что он не отображается на экране?

Любые другие способы предложить?

ответ

1

Я закончил получать прекрасные, быстрые UIImages из рамок видео:
1) Создание AVURLAsset с URL-адресом видео.
2) Создание AVAssetReader с активом.
3) Установка свойства timeRange для читателя.
4) Создание AVAssetReaderTrackOutput с первой дорожкой от актива.
5) Добавление вывода к считывателю.

Затем для каждого кадра:
6) Вызов [output copyNextSampleBuffer].
7) Передача буфера выборки в CMSampleBufferGetImageBuffer.
8) Передача буфера изображения в CVPixelBufferLockBaseAddress, только для чтения
9) Получение базового адреса буфера изображения с CVPixelBufferGetBaseAddress
10) Вызов CGBitmapContextCreate с размерами из буфера изображения, передавая базовый адрес в качестве места нахождения пиксели CGBitmap.
11) Вызов CGBitmapContextCreateImage для получения CGImageRef.

Я был очень рад найти, что это работает на удивление хорошо для чистки. Если пользователь хочет вернуться к предыдущей части видео, просто создайте новый AVAssetReader с новым временным диапазоном и идите. Это довольно быстро!

 Смежные вопросы

  • Нет связанных вопросов^_^