【问题标题】:Applying CIFilter to video in iOS将 CIFilter 应用于 iOS 中的视频
【发布时间】: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


【解决方案1】:

我已经解决了这个问题,问题在于初始化 CIImage 行:

//Wrong

CIImage *beginImage = image.CIImage;

//Right
CIImage *beginImage = [CIImage imageWithCGImage:imageRef];

正如布拉德所说,性能是不可接受的。在 iPad2 上,视频比音频滞后约 5 秒。所以我会为此研究其他解决方案,但我仍然很高兴看到它更像是一个概念证明而不是其他任何东西:)

【讨论】:

    猜你喜欢
    • 2016-12-31
    • 2020-01-19
    • 2012-03-30
    • 1970-01-01
    • 2017-06-29
    • 2019-05-22
    • 2014-03-28
    • 2018-02-17
    • 2014-07-14
    相关资源
    最近更新 更多