我正在尝试在OpenGL中制作播放器。我使用ffmpeg解码视频。
我搜索了几个教程(StackOverflow,....)如何转换我的pFrameRGB-> OpenGL中的数据[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]);
}
我试着跑,但什么都没有......
答案 0 :(得分: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
一次;将空指针传递给数据以初始化纹理而不设置数据。