将视频帧绘制为GL_TEXTURE_RECTANGLE_EXT或GL_TEXTURE_2D

时间:2014-03-16 23:20:00

标签: objective-c cocoa opengl video avfoundation

我正在处理将视频帧发送到Syphon的mac(objective-c)应用程序。

尽管我很乐意说我有这个项目的起点,但我只能获得一些垃圾代码,包括OpenGL.frameworkAVFoundation和{项目中的{1}}

我认为this问题可能有助于逐帧加载视频,this有关使用OpenGL播放视频的问题,但两者都没有真正淘汰。

我一直在对AVFoundation进行一些研究,似乎有多种方法来加载视频,但我无法看到加载一个单一的框架

这是我的目标:

  1. 将视频作为mov加载到应用程序中。 (视频将具有恒定的帧速率)
  2. 从视频文件的 n 帧创建GL_TEXTURE_RECTANGLE_EXT或GL_TEXTURE_2D
  3. 它必须能够达到最低30fps(按顺序选择和绘制的帧)
  4. 如果有人可以为此推荐一个方向,这将给我一个很好的方向来真正开始。我真的不知道如何实现目标1,更不用说目标2了。

1 个答案:

答案 0 :(得分:2)

我已经实现了类似的应用程序,但它不是.mov,而是加载静态图像。我建议从单帧获取NSImage。 (不知道该怎么做)

然后,从NSImage获取纹理:

- (void)textureFromImage:(NSImage*)theImg textureName:(GLuint*)texName
{
    NSBitmapImageRep* bitmap = [NSBitmapImageRep alloc];
    int samplesPerPixel = 0;
    NSSize imgSize = [theImg size];

    [theImg lockFocus];
    [bitmap initWithFocusedViewRect:
                    NSMakeRect(0.0, 0.0, imgSize.width, imgSize.height)];
    [theImg unlockFocus];

    // Set proper unpacking row length for bitmap.
    glPixelStorei(GL_UNPACK_ROW_LENGTH, [bitmap pixelsWide]);

    // Set byte aligned unpacking (needed for 3 byte per pixel bitmaps).
    glPixelStorei (GL_UNPACK_ALIGNMENT, 1);

    // Generate a new texture name if one was not provided.
    if (*texName == 0)
        glGenTextures (1, texName);
    glBindTexture (GL_TEXTURE_RECTANGLE_EXT, *texName);

    // Non-mipmap filtering (redundant for texture_rectangle).
    glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER,  GL_LINEAR);
    samplesPerPixel = [bitmap samplesPerPixel];

    // Nonplanar, RGB 24 bit bitmap, or RGBA 32 bit bitmap.
    if(![bitmap isPlanar] &&
        (samplesPerPixel == 3 || samplesPerPixel == 4))
    {
        glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0,
            samplesPerPixel == 4 ? GL_RGBA8 : GL_RGB8,
            [bitmap pixelsWide],
            [bitmap pixelsHigh],
            0,
            samplesPerPixel == 4 ? GL_RGBA : GL_RGB,
            GL_UNSIGNED_BYTE,
            [bitmap bitmapData]);
    }
    else
    {
        // Handle other bitmap formats.
    }

    // Clean up.
    [bitmap release];
}

帧速率将由运行这些操作的NSTimer确定。

如果所有这些都不起作用,请看一下这个开源电影播放器​​(http://v002.info/plugins-sources/v002-movie-player-beta/),也许这可以帮助您获得更接近Siphon样本的解决方案实现。 祝你好运(: