Если вы на прошивке 5.0, вы можете использовать vImage в убыстрениях рамок сделать NEON оптимизированного компонента цвета свопа с использованием коды, как показано ниже (взято из WebCore source code компании Apple):
vImage_Buffer src;
src.height = height;
src.width = width;
src.rowBytes = srcBytesPerRow;
src.data = srcRows;
vImage_Buffer dest;
dest.height = height;
dest.width = width;
dest.rowBytes = destBytesPerRow;
dest.data = destRows;
// Swap pixel channels from BGRA to RGBA.
const uint8_t map[4] = { 2, 1, 0, 3 };
vImagePermuteChannels_ARGB8888(&src, &dest, map, kvImageNoFlags);
где width
, height
и srcBytesPerRow
получены из вашего буфера пикселей через CVPixelBufferGetWidth()
, CVPixelBufferGetHeight()
и CVPixelBufferGetBytesPerRow()
. srcRows
будет указателем на базовый адрес байтов в пиксельном буфере, а destRows
- это память, которую вы выделили для хранения выходного изображения RGBA.
Это должно быть намного быстрее, чем просто повторять байты и заменять цветовые компоненты.
В зависимости от размера изображения еще более быстрым решением было бы загрузить фрейм в OpenGL ES, визуализировать простой прямоугольник с этим как текстуру и использовать glReadPixels() для вытягивания значений RGBA. Еще лучше было бы использовать кеширование текстур iOS 5.0 для загрузки и загрузки, где этот процесс занимает всего 1-3 мс для кадра 720p на iPhone 4. Конечно, использование OpenGL ES означает гораздо более поддерживающий код для вытягивания это выключено.
Вы попробовали запросить другой формат? – hooleyhoop
Да, я сделал; кажется, что, по крайней мере, для последней версии iOS, при запросе 32-разрядного формата ARGB, к сожалению, возникает исключение. В частности, это говорит о том, что ARGB не поддерживается. –