【问题标题】:Draw a frame of video as a GL_TEXTURE_RECTANGLE_EXT or GL_TEXTURE_2D将视频帧绘制为 GL_TEXTURE_RECTANGLE_EXT 或 GL_TEXTURE_2D
【发布时间】:2014-03-16 23:19:59
【问题描述】:

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

尽管我很想说我有这个项目的起点,但我只得到了一些垃圾代码,包括项目中的 OpenGL.frameworkAVFoundationSyphon.framework

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

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

这是我的目标:

  1. 将视频作为 mov 加载到应用程序中。 (视频将具有恒定的帧速率)
  2. 从视频文件的 n 帧创建 GL_TEXTURE_RECTANGLE_EXT 或 GL_TEXTURE_2D
  3. 它必须能够达到最低 30fps(按顺序选择和绘制的帧)

如果有人可以推荐这方面的发展方向,那将为我提供一个真正开始的好方向。我真的不知道如何完成目标 1,更不用说目标 2。

【问题讨论】:

    标签: objective-c cocoa opengl video avfoundation


    【解决方案1】:

    我已经实现了一个类似的应用程序,但它加载的是静态图像而不是 .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 示例实现的解决方案。 祝你好运(:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-17
      • 2017-07-19
      • 2012-12-05
      • 1970-01-01
      • 2018-08-20
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多