2012-12-06 86 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大小,然後使用頂點座標或縮放矩陣來控制寬度/高度。同樣在這一點上,你可能想要啓動你的時間分析器來查看哪一行是最耗時的。 –