2012-12-06 58 views
2

对不起,我的英语的OpenGL ES(iphone)从文件渲染

我想从一个文件中显示视频,其中的每像素4个字节,BRGA,1280×720的框架?

在Mac上我只是拿出框架,并绘制了这个glDrawPixels,在Mac上运行,但在opengl es所有不同。

这里的代码从MAC

int pos = 0; 
NSData *data = [[NSData alloc] initWithContentsOfFile:@"video.raw"]; 
glViewport(0,0,width,height); 
glLoadIdentity(); 
glOrtho(0, width, 0, height, -1.0, 1.0); 
glPixelZoom(1, -1); 
glClear(GL_COLOR_BUFFER_BIT); 
//glRasterPos2i(0, height); 
glRasterPos2i(0, 0); 
glDrawPixels(1280, 720, GL_BGRA, GL_UNSIGNED_BYTE, [data bytes]+pos); 
glFinish(); 
+0

如何获取文件。 H264?然后到另一个,并使用Linux! – user1881371

回答

2

推送这些数据以纹理“glTexSubImage2D”和渲染纹理。不过,请注意质地必须是2的幂的所以你的情况,你可以把它(2048,1024),但你可以只更新(1280,720)部分:

CGSize videoSize; 
CGSize textureSize; 
GLuint dimension = 1; 
while (videoSize.width > dimension) { 
    dimension <<= 1; 
} 
textureSize = CGSizeMake(dimension, .0f); 
dimension = 1; 
while (videoSize.height > dimension) { 
    dimension <<= 1; 
} 
textureSize = CGSizeMake(textureSize.width, dimension); 

GLuint texture; 
glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureSize.width, textureSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

GLfloat textureCoordinates[] = { 
    .0f, .0f, 
    .0f, videoSize.height/textureSize.height, 
    videoSize.width/textureSize.width, .0f, 
    videoSize.width/textureSize.width, videoSize.height/textureSize.height 
}; 

要更新质地:

void *data; 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, videoSize.width, videoSize.height, GL_RGBA, GL_UNSIGNED_BYTE, data); 

然后只是画你的纹理四。

+0

是的,我尝试了两种,我没有工作,我会尝试!如果可能的话代码是 ? – user1881371

+0

是的!这工作!谢谢! 还有其他想法吗?比这渲染纹理更快,我尝试过,但尚未获得 – user1881371

+0

我从来没有尝试过,但如果视频大小与纹理大小相同,它可以更快地推送数据,这可能是合乎逻辑的。您可以将视频文件导出为2大小,然后使用顶点坐标或缩放矩阵来控制宽度/高度。同样在这一点上,你可能想要启动你的时间分析器来查看哪一行是最耗时的。 –