Изчертаване на кадри от филм в CGBitmapContext

Имам приложение, което трябва да рендира кадри от видео/филм в CGBitmapContext с произволен CGAffineTransform. Бих искал да има прилична честота на кадрите, като поне 20 кадъра в секунда.

Опитах да използвам AVURLAsset и [AVAssetImageGenerator copyCGImageAtTime:] и както ясно се посочва в документацията за този метод, той е доста бавен, понякога ме сваля до 5 кадъра в секунда.

Какъв е по-добрият начин да направите това? МИСЛЯ, че мога да настроя AVPlayer с AVPlayerLayer, след което да използвам [CGLayer renderInContext:] с моята трансформация. Щеше ли да работи? Или може би AVPlayerLayer не се изпълнява, когато забележи, че не се показва на екрана?

Някакви други начини да предложите?


person Christopher Schardt    schedule 24.10.2013    source източник


Отговори (1)


В крайна сметка получих прекрасни, бързи UII изображения от кадрите на видеоклип чрез:
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 с новия времеви диапазон и отидете. Доста е бързо!

person Christopher Schardt    schedule 05.04.2014