我使用vImageConvert_RGB888toPlanar8和vImageConvert_Planar8toRGB888来自Accelerate.framework将RGB24转换为BGR24,但是当需要转换的数据非常大时,例如3M或4M,需要花费的时间大约是10ms.所以有人知道一些足够快的想法吗?.我的代码如下:
- (void)transformRGBToBGR:(const UInt8 *)pict{
rgb.data = (void *)pict;
vImage_Error error = vImageConvert_RGB888toPlanar8(&rgb,&red,&green,&blue,kvImageNoFlags);
if (error != kvImageNoError) {
NSLog(@"vImageConvert_RGB888toARGB8888 error");
}
error = vImageConvert_Planar8toRGB888(&blue,&green,&red,&bgr,kvImageNoFlags);
if (error != kvImageNoError) {
NSLog(@"vImagePermuteChannels_ARGB8888 error");
}
free((void *)pict);
}
Run Code Online (Sandbox Code Playgroud) AudioToolBox中的某些函数总是抛出__cxa_throw,同时ExtAudioFileDispose等函数运行良好,返回值为零,这是正常的.当我想使用try {} catch(...){}块捕获此异常时,但这不起作用.在Xcode的所有例外情况下,可以捕获此异常.在这里,只想了解__cxa_throw是什么,以及如何以编程方式捕获它?
我使用opengl es在iPad上显示bgr24数据,我是关于opengl es的新手,所以在显示视频部分我使用来自RosyWriter的代码一个APPLE样本.它可以工作,但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);
}
Run Code Online (Sandbox Code Playgroud)
并且在变换之后,将生成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; …Run Code Online (Sandbox Code Playgroud)