我正在研究将视频帧发送到Syphon的mac(目标-c)应用程序。

我想说我有一个这个项目的起点,但是我只涉及到一些垃圾代码,并且在项目中包括了OpenGL.frameworkAVFoundationSyphon.framework

我认为this问题可能有助于逐帧加载视频,而this问题则涉及使用OpenGL播放视频,但都没有真正解决。

我一直在对AVFoundation进行一些研究,似乎可以通过多种方式加载视频,但是我看不到任何方式加载单个帧

这是我的目标:


将视频作为mov加载到应用程序中。 (视频将具有恒定的帧频)
从视频文件的第n帧创建GL_TEXTURE_RECTANGLE_EXT或GL_TEXTURE_2D
它必须至少能够达到30fps(依次选择和绘制帧)


如果有人可以为此建议什么方向,那将给我一个真正开始的好方向。我真的不知道如何实现目标1,更不用说目标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示例实现的解决方案。
祝好运 (:

关于objective-c - 以GL_TEXTURE_RECTANGLE_EXT或GL_TEXTURE_2D的形式绘制视频帧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22444460/

10-16 23:33