У меня 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 без лишних преобразований?