Способ в режиме реального времени извлечь все видеокадры в формате YV12 (YUV420) из фильма QuickTime? - PullRequest
1 голос
/ 15 апреля 2011

У меня открыт QTMovie в QTKit.

Мне нужно получить каждый кадр этого видео в формате YV12 ( kYUV420PixelFormat ) в режиме реального времени (т.е. я передаю его ввнешний код, который принимает только YV12 и должен воспроизводить видео в режиме реального времени).

Кажется, Как это должно быть сделано это вызов [movie frameImageAtTime: [movie currentTime] withAttributes: error:] для текущего кадра, а затем [movie stepForward] , чтобы перейти к следующему кадру, и так далее, пока я не получу все кадры.Тем не менее, насколько я в этом разбираюсь, я не могу найти способ заставить QTKit выдавать мне данные в формате YV12 или любом другом формате YUV. frameImageAtTime: вызов может преобразовать его в:

  • NSImage (но NSImage не может хранить плоское YUV),
  • CGImage (то же самое),
  • CIImage (тоже самое),
  • CVPixelBuffer (этот может хранить YUV, но, похоже, нет способа настроить вызов для получения YUV из него. По умолчанию он возвращает данные ARGB32)
  • Текстура OpenGL (это, вероятно, также можно настроить, но мне не нужны эти данные в OpenGL, они нужны мне в памяти)

Так что, похоже, единственный способ использовать этоякобы новая и оптимизированная технология QTKit состоит в том, чтобы получать из нее данные ARGB, преобразовывать каждый кадр в YV12 с помощью специального кода и надеяться, что он все еще будет достаточно быстрым для работы в реальном времени.Или я что-то упустил?

В старом QuickTime было относительно легко настроить GWorld с kYUV420PixelFormat , иметь рендеринг фильма на него, и он просто работал .Но старые вызовы QuickTime - это устаревшие, устаревшие вызовы, которые больше не будут использоваться ...

Что я должен сделать, чтобы получить планарные кадры YUV420 без ненужных преобразований?

1 Ответ

0 голосов
/ 04 сентября 2011

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

http://lists.apple.com/archives/quicktime-api/2008/Nov/msg00049.html

5 ноября 2008 г., в 12:08, Нил Клейтон написал:

Я хотел бы получить кадр YUV из фильма (фильм закодирован в YUV, кадры изначально были k2vuyPixelFormat, и формат кодировщика был бы совместим с этим - например: H264 или AIC и т. Д.).

Когда я делаю это:

NSError *error = nil;
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
    QTMovieFrameImageTypeCVPixelBufferRef, QTMovieFrameImageType,
    [NSNumber numberWithBool:YES], QTMovieFrameImageHighQuality,
    nil];
CVPixelBufferRef buffer = [qtMovie frameImageAtTime:QTMakeTime(lastFrame, movie.timeScale)
    withAttributes:dict error:&error];

Рамка кажется действительной.Он имеет правильную ширину и высоту.Но, кажется, он имеет тип k32ARGBPixelFormat, когда я делаю:

OSType type = CVPixelBufferGetPixelFormatType(buffer);

Предполагается, что я делаю это неправильно - какой правильный метод для получения кадра типа k2vuyPixelFormat из фильма?Или, если это невозможно, как проще всего выполнить преобразование RGB-YUV в CVPixelBuffer типа k2vuyPixelFormat?Мне здесь не нужна скорость (это одноразовая, однокадровая операция).

7 ноября 2000 года Тим Монро из QuickTime Engineering отвечает:

В настоящее время нет способа сделать то, что вы хотите, с помощью frameImageAtTime.Я бы предложил подать запрос на улучшение.

...