【发布时间】:2012-05-05 15:20:30
【问题描述】:
我正在开发一个视频会议应用程序,以下代码成功地在屏幕上绘制了一个框架:
-(int)drawFrameOnMainThread{
if(mBitmapContext){
if(mDisplay){
CGImageRef imageRef = CGBitmapContextCreateImage(mBitmapContext);
#if TARGET_OS_IPHONE
UIImage *image = [UIImage imageWithCGImage:imageRef];
[self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];
#elif TARGET_OS_MAC
[mDisplay setCurrentImage:imageRef];
#endif
CGImageRelease(imageRef);
}
}
return 0;
}
我想对正在绘制的框架应用 CIFilter,所以我修改了代码的 iOS 部分,如下所示:
UIImage *image = [UIImage imageWithCGImage:imageRef];
CIImage *beginImage = image.CIImage;
CIContext *context = [CIContext contextWithOptions:nil];
CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"
keysAndValues: kCIInputImageKey, beginImage,
@"inputIntensity", [NSNumber numberWithFloat:0.8], nil];
CIImage *outputImage = [filter outputImage];
CGImageRef cgimg =
[context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *newImg = [UIImage imageWithCGImage:cgimg];
[self performSelectorOnMainThread:@selector(setImage:) withObject:newImg waitUntilDone:YES];
结果是我的视频屏幕保持黑色。任何人都可以在这里看到错误吗?我已经在这几个小时了,但无法弄清楚。
【问题讨论】:
-
如果不解决黑屏问题,我只会说使用 UIImage 源和 Core Image 制作任何类型的视频在实际设备上都会非常慢,除非您的视频大小为邮票。往返于 UIImage 有很多核心图形开销,然后在视图中手动重绘该图像会增加更多的速度。另外,正如我在这里进行的基准测试:stackoverflow.com/a/6628208/19679 Core Image 在 iOS 上的速度不如它应有的速度。
-
如果您要从相机中提取这些视频帧,您真的会想要使用 OpenGL ES 或类似我的 GPUImage 框架的东西来获得高性能的视频过滤和显示。如果这些是从网络源提取的视频帧,可能会有点困难,但您仍需要使用 OpenGL ES(或用于 Mac 客户端的 OpenGL)上传和显示这些帧。
-
我其实是从网络源拉取视频的,没有任何过滤,性能很好。 (我正在使用 link )您建议过滤什么?也许在服务器端做?
-
谨慎使用该代码,它是 GPL,这意味着您也必须在 GPL 下发布整个应用程序源代码。事实上,GPLv3 可能与 App Store 上的应用程序不兼容(为此至少已经拉出了另一个应用程序)。
-
你在什么设备上测试这个?它在 4S 或 iPad 2+ 上的性能可能还不错,但我敢打赌,它会通过不断地在视图中重绘图像来消耗大量 CPU 周期。如果您可以从图像中获取原始 BGRA 字节,则最好将它们上传为使用 OpenGL ES 显示的纹理。我对 GPUImage 中的图像源做了类似的事情,但我还没有原始数据输入类。
标签: ios core-image