-1

我正在尝试在 OpenGL 中制作一个播放器。我使用 ffmpeg 解码视频。

我搜索了几个教程(StackOverflow,....)如何在 OpenGL 中转换我的 pFrameRGB-> 数据 [0] 纹理,但它仍然显示了一个白色方块。我将我的视频转换为 512x256 以符合 2 ^ n。

我知道我的 pFrameRGB 是正确的,因为我可以使用“SaveFrame (...)”函数创建 frameX.ppm。

通过适应我的播放器,我使用以下源代码 ( https://github.com/arashafiei/dranger-ffmpeg-tuto/blob/master/tutorial02.c ) 作为模型。

这是我的源代码:

http://www.sourcepod.com/uagkel22-19078

你们中的一个有解决我的问题的方法吗?

编辑1:

我删除:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 1 ? GL_REPEAT : GL_CLAMP );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 1 ? GL_REPEAT : GL_CLAMP );

并替换:

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, pCodecCtx->width, pCodecCtx->height, 0, GL_RGB, GL_UNSIGNED_BYTE, pFrameRGB->data[0]);

经过:

if(firstRendering){
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, pCodecCtx->width, pCodecCtx->height, 0, GL_RGB, GL_UNSIGNED_BYTE, pFrameRGB->data[0]);

firstRendering = 0;

}else{

glActiveTexture(texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, pCodecCtx->width, pCodecCtx->height, GL_RGB, GL_UNSIGNED_BYTE, pFrameRGB->data[0]);
}

我试着跑,但什么也没有……

4

1 回答 1

0

在您的源代码中,您有以下几行:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 1 ? GL_REPEAT : GL_CLAMP );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 1 ? GL_REPEAT : GL_CLAMP );

首先,您要设置的值是整数,因此您必须使用glTexParameteri(注意i最后的)。

其次,首先禁用 mipmapping,然后尝试重新启用它。如果要进行 mipmap,则必须提供完整的图像金字塔(在选定的 LoD 范围内)。对于视频播放器,您通常希望禁用 mipmapping:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

我将我的视频转换为 512x256 以符合 2 ^ n。

不需要,从 OpenGL-2 开始。因为那个版本的纹理图像可能是任意尺寸的。

另外,我建议您不要将视频帧传递给glTexImage2D,它会执行完整的纹理对象初始化,而是使用glTexSubImage2D它来替换图像数据。glTexImage2D在第一次调用之前,您必须glTexSubImage2D使用正确的格式参数调用一次;传递一个指向数据的空指针来初始化纹理而不设置数据。

于 2013-06-12T09:46:53.267 回答