2013-06-12 138 views
-1

我想在OpenGL中製作一個播放器。我使用ffmpeg來解碼視頻。ffmpeg與glTexImage2D的opengl紋理

我搜索了幾個教程(StackOverflow,....)如何在OpenGL中轉換我的pFrameRGB-> data [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]); 
} 

,我嘗試運行但stiil什麼......

+0

你是否在任何地方調用'glEnable(GL_TEXTURE_2D)'?我沒有在你的代碼中看到它。 – GuyRT

回答

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範圍內)。對於視頻播放器通常要禁用紋理映射:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

我將我的視頻,以512x256遵守2^N。

從OpenGL-2開始不需要。由於該版本紋理圖像可能具有任意尺寸。

而不是將視頻幀傳遞到glTexImage2D,它完成紋理對象初始化,我建議您使用glTexSubImage2D,它只是替換圖像數據。在第一次撥打glTexSubImage2D之前,您必須撥打glTexImage2D一次,並輸入正確的格式參數;將空指針傳遞給數據以初始化紋理而不設置數據。

+0

我根據你的意見替換我的代碼,但仍然沒有什麼...我的代碼有什麼問題... – 2kPi

+0

@ 2kPi:唯一的方法告訴:亂七八糟的東西有很多很多的錯誤檢查和診斷記錄打印。 – datenwolf