Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CVOpenGLESTexture方法类型的官方文档在哪里?_Ios_Xcode_Opengl Es_Ios5 - Fatal编程技术网

Ios CVOpenGLESTexture方法类型的官方文档在哪里?

Ios CVOpenGLESTexture方法类型的官方文档在哪里?,ios,xcode,opengl-es,ios5,Ios,Xcode,Opengl Es,Ios5,我尝试了google和stackoverflow,但我似乎找不到以CVOpenGLESTexture开头的函数的官方文档。我可以看到它们来自核心视频,我知道它们是在iOS 5上添加的,但是搜索文档并没有给我任何信息 我正在寻找有关参数的信息,它们做什么,如何使用它们等等,就像在其他苹果框架中一样 到目前为止,我所能做的就是命令点击它来查看信息,但这感觉非常奇怪。或者有没有一种方法可以添加它,以便它可以显示在xcode右侧的快速帮助中 如果这是一个愚蠢的问题,谢谢你,对不起 PD:《核心视频参考指

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

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

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

如果这是一个愚蠢的问题,谢谢你,对不起


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

不幸的是,没有关于这些新功能的任何文档。您现在可以在
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提供了一些示例,展示了如何将快速纹理上传路径与BGRA和YUV输入颜色格式结合使用。苹果还在WWDC上提供了ChromaKey示例(该示例可能仍然可以与视频一起访问),演示了如何使用这些纹理缓存从OpenGL ES纹理中提取信息

我刚刚在我的框架中实现了这种快速纹理上传(源代码在该链接中提供),因此我将展示我能够从中解析的内容。首先,我使用以下代码创建纹理缓存:

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设备上产生了真正的不同。在iPhone4S上上传和处理一个640x480帧的视频需要9.0毫秒到1.8毫秒


我也尝试过在某些情况下替换
glReadPixels()
,但我还没有尝试过。

苹果公司终于在一周多前发布了这篇文章。

对于这样一种高效的图像处理方法,没有很好的文档记录,这确实令人遗憾。但多亏了像你这样经验不足的人,开发者也可以尝试使用它。你能为照片预设设置纹理缓存吗?对于
CVOpenGLESTextureCacheCreate
@Dex,我在
CFDictionaryRef cacheAttributes
的任何地方都找不到任何信息-是的,这适用于照片预设,设置与我用于视频帧的设置相同。请参阅我上面的链接框架,了解我使用的选项代码。需要注意的一点是,在iPhone4上,摄像头可以捕获比该设备上最大纹理大小更大的帧。这些照片不能直接作为纹理处理,因此需要某种类型的平铺来处理它们。“我正在研究这个。@布拉德拉尔森,你知道是否可以持久化
输出文本
?我正在尝试暂时缓存它,以便在另一种方法中使用,而不必对额外的纹理进行任何额外的复制。不释放它是一个开始,但似乎无法继续工作。@Dex-如果希望数据在当前视频帧之后继续存在,则需要将其中的数据复制到某个位置,因为当下一个相机帧进入时,数据将被覆盖。一种快速的方法是将四边形上的穿透着色器渲染到纹理支持的FBO。这不是文档。苹果公司的人复制/粘贴方法名称,并在大小写单词之间添加空格。标题源代码注释实际上比这个更有用,IME-它们有更多的细节!