尝试将 CIImage 与从视频文件帧获得的纹理一起使用时,CIImage 为空白

Posted

技术标签:

【中文标题】尝试将 CIImage 与从视频文件帧获得的纹理一起使用时,CIImage 为空白【英文标题】:CIImage is blank when trying to use it with texture obtained from video file frame 【发布时间】:2016-02-01 18:15:10 【问题描述】:

我正在尝试创建一个将过滤器应用于视频文件的应用。我想使用核心图像过滤器

    imageBuffer obtained from AVAssetReaderInput

    int height = (int)CVPixelBufferGetHeight(imageBuffer);
    int width = (int)CVPixelBufferGetWidth(imageBuffer);

    glActiveTexture(GL_TEXTURE0);
    CVReturn error;
    CVOpenGLESTextureRef _textureRef;
    error = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault,
                                                          self.openGLContext.textureCache,
                                                          imageBuffer,
                                                          NULL, // texture attributes
                                                          GL_TEXTURE_2D,
                                                          GL_RGBA, // opengl format
                                                          width,
                                                          height,
                                                          GL_BGRA,
                                                          GL_UNSIGNED_BYTE, // native ios format
                                                          0,
                                                          &_textureRef);

    if (error) 
      NSLog(@"Error while creating Texture");
    


    glBindTexture(CVOpenGLESTextureGetTarget(_textureRef), CVOpenGLESTextureGetName(_textureRef));
    GLint texture = CVOpenGLESTextureGetName(_textureRef);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    CIContext *context = [CIContext contextWithEAGLContext:self.openGLContext.context options:nil];

    CIImage *my_image = [CIImage imageWithTexture:texture size:CGSizeMake(1280, 720) flipped:NO colorSpace:nil];

CIImage (my_image) 始终为空白(即显示为黑色)并且不包含视频纹理。 我正在 iPhone 6 设备上对其进行测试。 我哪里错了?

【问题讨论】:

你有没有想过这个问题? 【参考方案1】:

你为什么不用它来创建你的 CIImage:

     CIImage *inputImage = [CIImage imageWithCVPixelBuffer:imageBuffer options:nil];

您可以将过滤器应用于此图像。

【讨论】:

以上是关于尝试将 CIImage 与从视频文件帧获得的纹理一起使用时,CIImage 为空白的主要内容,如果未能解决你的问题,请参考以下文章

将纹理特征集成到基于颜色的视频帧对象检测

Windows Media Foundation 使用 IMFTransform 将 mp4 电影帧解码为 2D 纹理

如何在 Windows 8 现代应用程序上从视频流中抓取帧?

ffmpeg 视频到 opengl 纹理

JOGL 和帧缓冲区渲染到纹理的问题:无效帧缓冲区操作错误

OSX 上的 AVFoundation:来自视频的 OpenGL 纹理,无需访问像素数据