我使用OpenGL ES在iPad上显示BGR24数据,但是我对OpenGL ES还不熟悉,所以在视频显示部分,我使用了苹果的RosyWriter示例代码。它可以运行,但是CVOpenGLESTextureCacheCreateTextureFromImage函数的执行时间超过了30毫秒,在RosyWriter中它的执行时间可以忽略不计。 我的做法是先将BGR24转换为BGRA像素格式,然后使用CVPixelBufferCreateWithBytes函数创建一个CVPixelBufferRef,最后通过CVOpenGLESTextureCacheCreateTextureFromImage获取CVOpenGLESTextureRef。下面是我的代码:
- (void)transformBGRToBGRA:(const UInt8 *)pict width:(int)width height:(int)height
{
rgb.data = (void *)pict;
vImage_Error error = vImageConvert_RGB888toARGB8888(&rgb,NULL,0,&argb,NO,kvImageNoFlags);
if (error != kvImageNoError) {
NSLog(@"vImageConvert_RGB888toARGB8888 error");
}
const uint8_t permuteMap[4] = {1,2,3,0};
error = vImagePermuteChannels_ARGB8888(&argb,&bgra,permuteMap,kvImageNoFlags);
if (error != kvImageNoError) {
NSLog(@"vImagePermuteChannels_ARGB8888 error");
}
free((void *)pict);
}
转换后生成CVPixelBufferRef,代码如下所示:
[self transformBGRToBGRA:pict width:width height:height];
CVPixelBufferRef pixelBuffer;
CVReturn err = CVPixelBufferCreateWithBytes(NULL,
width,
height,
kCVPixelFormatType_32BGRA,
(void*)bgraData,
bytesByRow,
NULL,
0,
NULL,
&pixelBuffer);
if(!pixelBuffer || err)
{
NSLog(@"CVPixelBufferCreateWithBytes failed (error: %d)", err);
return;
}
CVOpenGLESTextureRef texture = NULL;
err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
videoTextureCache,
pixelBuffer,
NULL,
GL_TEXTURE_2D,
GL_RGBA,
width,
height,
GL_BGRA,
GL_UNSIGNED_BYTE,
0,
&texture);
if (!texture || err) {
NSLog(@"CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err);
CVPixelBufferRelease(pixelBuffer);
return;
}
其他代码与RosyWriter示例几乎相似,包括着色器。因此我想知道为什么会出现这个问题,以及如何解决。
-transformBGRToBGRA:
方法的时间吗? - Brad LarsonCVPixelBufferCreateWithBytes()
调用之前到CVOpenGLESTextureCacheCreateTextureFromImage()
调用之后的时间吗?这似乎非常高,因为我曾经看到iPad 2上传1080p帧(像素数增加了2.6倍)比30毫秒快得多。如果您只使用此数据和glTexImage2D()
,那么您的时间是多少? - Brad Larson