【问题标题】:GPUImage: is there callback function when a filter is done processing a frame from GPUImageVideoCameraGPUImage:当过滤器完成处理来自 GPUImageVideoCamera 的帧时是否有回调函数
【发布时间】:2014-02-24 19:42:02
【问题描述】:

基本上,我想从 iPhone 相机中抓取帧,将它们输入到自定义过滤器,然后从自定义过滤器获取结果到我自己的 CPU 内存中以进行进一步处理。问题是相机每秒向过滤器发送 30 帧,我如何知道该过滤器何时完成一帧?换句话说,当滤镜处理完来自相机的每一帧时,是否有回调函数?代码如下:

    videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
    videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
    MyOwnGPUFilter *mof=[[MyOwnGPUFilter alloc] init];
    [videoCamera addTarget:mof];
    [videoCamera startCameraCapture];

【问题讨论】:

    标签: ios iphone callback camera gpuimage


    【解决方案1】:

    对于这样的事情,我建议使用 GPUImageRawDataOutput 类并设置其newFrameAvailableBlock。如果您将 GPUImageRawDataOutput 设置为过滤器的目标,则该块将在过滤器完成处理的那一刻被触发。

    GPUImageRawDataOutput 让您可以直接访问原始颜色数据,并使用最有效的方法将其拉下来。这应该可以很容易地将这些颜色字节传递到您的 CPU 端处理中。

    【讨论】:

    • 谢谢布拉德。我不敢相信你回复得这么快。 GPUImage 是一个很棒的工具。我稍后会尝试你的建议。顺便说一句,我在 GPUImageOutput 类中找到了 frameProcessingCompletionBlock。过滤器完成后是否也会调用某些东西?
    • @user3348157 - 是的,但我确实在一些更复杂的图像处理操作中加入了这一点(我认为角和线检测器使用它,但它们有自己的回调),所以如果在某些情况下它会失败,这就是原因。应该适用于大多数过滤器,但如果你正在读取 CPU,我强烈推荐原始数据输出。在支持它的设备上,我使用纹理缓存来显着加快读取速度。
    • 我是否还需要调用 MyOwnGPUFilter 或 GPUImageRawDataOutput 的 prepareForImageCapture 才能更快地从 GPU 下载?
    • @user3348157 - GPUImageRawDataOutput 默认处理所有这些。如果您希望使用标准过滤器并从中捕获图像,-prepareForImageCapture 将在下一次图像捕获操作中触发在glReadPixels() 上使用纹理缓存。
    猜你喜欢
    • 2018-11-26
    • 1970-01-01
    • 2012-12-30
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    相关资源
    最近更新 更多