【问题标题】:Where is the official documentation for CVOpenGLESTexture method types?CVOpenGLESTexture 方法类型的官方文档在哪里?
【发布时间】:2012-03-21 14:31:42
【问题描述】:

我尝试了 google 和 stackoverflow,但似乎找不到以 CVOpenGLESTexture 开头的函数的官方文档。我可以看到它们来自核心视频,我知道它们是在 iOS 5 上添加的,但搜索文档并没有给我任何信息。

我正在寻找有关参数、它们的作用、如何使用它们等的信息,就像在其他苹果框架中一样。

到目前为止,我所能做的就是命令单击它以查看信息,但这感觉非常奇怪。或者有没有办法添加它,以便它可以显示在 xcode 右侧的快速帮助中?

谢谢,如果这是一个愚蠢的问题。

PD:核心视频参考指南似乎也没有解释这些。

【问题讨论】:

    标签: ios xcode opengl-es ios5


    【解决方案1】:

    不幸的是,没有关于这些新功能的任何文档。你现在能找到的最好的是在CVOpenGLESTextureCache.h 头文件中,你会在其中看到函数参数的基本描述:

    /*!
        @function   CVOpenGLESTextureCacheCreate
        @abstract   Creates a new Texture Cache.
        @param      allocator The CFAllocatorRef to use for allocating the cache.  May be NULL.
        @param      cacheAttributes A CFDictionaryRef containing the attributes of the cache itself.   May be NULL.
        @param      eaglContext The OpenGLES 2.0 context into which the texture objects will be created.  OpenGLES 1.x contexts are not supported.
        @param      textureAttributes A CFDictionaryRef containing the attributes to be used for creating the CVOpenGLESTexture objects.  May be NULL.
        @param      cacheOut   The newly created texture cache will be placed here
        @result     Returns kCVReturnSuccess on success
    */
    CV_EXPORT CVReturn CVOpenGLESTextureCacheCreate(
                        CFAllocatorRef allocator,
                        CFDictionaryRef cacheAttributes,
                        void *eaglContext,
                        CFDictionaryRef textureAttributes,
                        CVOpenGLESTextureCacheRef *cacheOut) __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);
    

    更难的元素是属性字典,不幸的是,您需要找到它的示例才能正确使用这些功能。 Apple 提供了 GLCameraRippleRosyWriter 示例,展示了如何使用带有 BGRA 和 YUV 输入颜色格式的快速纹理上传路径。 Apple 还在 WWDC 上提供了 ChromaKey 示例(可能仍可与视频一起访问),演示了如何使用这些纹理缓存从 OpenGL ES 纹理中提取信息。

    我刚刚在我的GPUImage 框架中进行了这种快速纹理上传(该链接中提供了源代码),所以我将列出我能够从中解析出的内容。首先,我使用以下代码创建纹理缓存:

    CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache);
    if (err) 
    {
        NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d");
    }
    

    这里引用的上下文是为 OpenGL ES 2.0 配置的 EAGLContext。

    我使用它来将来自 iOS 设备摄像头的视频帧保存在视频内存中,我使用以下代码来执行此操作:

    CVPixelBufferLockBaseAddress(cameraFrame, 0);
    
    CVOpenGLESTextureRef texture = NULL;
    CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture);
    
    if (!texture || err) {
        NSLog(@"CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err);  
        return;
    }
    
    outputTexture = CVOpenGLESTextureGetName(texture);
    glBindTexture(GL_TEXTURE_2D, outputTexture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    
    // Do processing work on the texture data here
    
    CVPixelBufferUnlockBaseAddress(cameraFrame, 0);
    
    CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0);
    CFRelease(texture);
    outputTexture = 0;
    

    这会从纹理缓存中创建一个新的 CVOpenGLESTextureRef,代表 OpenGL ES 纹理。此纹理基于相机传入的 CVImageBufferRef。然后从 CVOpenGLESTextureRef 中检索该纹理并为其设置适当的参数(这在我的处理中似乎是必要的)。最后,我对纹理进行处理并在完成后进行清理。

    这种快速上传过程对 iOS 设备产生了真正的影响。在 iPhone 4S 上上传和处理单个 640x480 帧视频的时间从 9.0 毫秒缩短到了 1.8 毫秒。

    我也有heard that this works in reverse,这可能允许在某些情况下替换glReadPixels(),但我还没有尝试过。

    【讨论】:

    • 这种有效的图像处理方法没有得到很好的文档记录确实令人遗憾。但是感谢像你这样经验较少的开发人员也可以尝试使用它。
    • 您能否让纹理缓存适用于照片预设?我在CFDictionaryRef cacheAttributes 的任何地方都找不到CVOpenGLESTextureCacheCreate 的任何信息
    • @Dex - 是的,这适用于照片预设,其设置与我用于视频帧的设置相同。请参阅我上面链接的框架以获取带有我使用的选项的代码。一个警告是,在 iPhone 4 上,相机可以捕捉比该设备上的最大纹理尺寸更大的帧。这些照片不能直接作为纹理处理,因此需要某种平铺来处理它们。我正在努力。
    • @BradLarson 你知道是否可以坚持outputTexture?我正在尝试暂时缓存它以在另一种方法中使用,而不必对额外的纹理进行任何额外的复制。不发布它是一个开始,但似乎仍然无法正常工作。
    • @Dex - 如果您希望数据在当前视频帧之外持续存在,则需要将其中的数据复制到某个地方,因为当下一帧进入时它将被覆盖。一个快这样做的方法是将四边形上的直通着色器渲染到纹理支持的 FBO。
    【解决方案2】:

    苹果终于在一周前发布了documentation

    【讨论】:

    • 那不是文档。那是苹果公司的某个人复制/粘贴方法名称,并在驼峰式单词之间添加空格。标头源代码 cmets 实际上比 IME 更有用——它们有更多细节!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 2022-01-17
    • 2018-08-20
    相关资源
    最近更新 更多