我正在研究将视频帧发送到Syphon的mac(目标-c)应用程序。
我想说我有一个这个项目的起点,但是我只涉及到一些垃圾代码,并且在项目中包括了OpenGL.framework
,AVFoundation
和Syphon.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/