像素格式,CVPixelBufferRefs和glReadPixels

MrD*_*ase 6 glreadpixels ios avassetwriter

我正在使用glReadPixels将数据读入CVPixelBufferRef.我用它CVPixelBufferRef作为输入AVAssetWriter.不幸的是,像素格式似乎不匹配.

我认为glReadPixels返回RGBA格式的AVAssetWriter像素数据,同时想要ARGB格式的像素数据.将RGBA转换为ARGB的最佳方法是什么?

这是我到目前为止所尝试的:

  • 沿argb =(rgba >> 8)|行的位操作 (rgba << 24)
  • 使用a CGImageRef作为中间步骤

位操作不起作用,因为CVPixelBufferRef似乎不支持下标.该CGImageRef中间步骤做的工作......但我不希望有代码50条额外的线路,有可能正影响性能.

rob*_*off 6

关于位操作,您可以获得指向像素缓冲区原始数据的指针:

CVPixelBufferLockBaseAddress(buffer, 0);
size_t stride = CVPixelBufferGetBytesPerRow(buffer);
char *data = (char *)CVPixelBufferGetBaseAddress(buffer);
for (size_t y = 0; y < CVPixelBufferGetHeight(buffer); ++y) {
    uint32_t *pixels = (uint32_t *)(data + stride * y);
    for (size_t x = 0; x < CVPixelBufferGetWidth(buffer); ++x)
        pixels[x] = (pixels[x] >> 8) | (pixels[x] << 24);
}
CVPixelBufferUnlockBaseAddress(buffer, 0);
Run Code Online (Sandbox Code Playgroud)


Rhy*_*man 6

比使用CPU交换组件更好的是编写一个简单的片段着色器,以便在渲染图像时在GPU上有效地执行此操作.

最好的方法是使用iOS5 CoreVideo CVOpenGLESTextureCache完全删除复制阶段,它允许您直接渲染到CVPixelBufferRef,从而消除对glReadPixels的调用.

ps我很确定AVAssetWriter想要BGRA格式的数据(实际上它可能想要它在yuv,但这是另一个故事).

更新:至于链接,doco似乎仍然在NDA下,但有两个可免费下载的示例代码:

GLCameraRippleRosyWriter

头文件本身包含良好的文档,并且mac等价物非常相似(CVOpenGLTextureCache),所以你应该有足够的东西让你开始.