2015-04-01 77 views
0

我想從我的應用程序(使用OpenGL)得到我的觀點被寫入到文件中。 這是我得到的OpenGL框架:ffmpeg的視頻輸出去飽和

glBindTexture(GL_TEXTURE_2D, renderTexture->getTextureData()->glId);  
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 

這工作得很好,並有正確的顏色。 (我通過將像素渲染爲單個圖像文件來檢查這一點)。

現在,因爲我想這在我使用的ffmpeg的編碼的視頻。這是我的命令:

ffmpeg -r 24 -pix_fmt rgba -s 1280x720 -f rawvideo -y -i - -vf vflip -vcodec mpeg1video -q:v 4 -bufsize 500KB -maxrate 5000KB 

這也是「有效」,但我的視頻與OpenGL的實際輸入相比非常不飽和。我該如何解決這個問題? (如果可能的話,我可以通過只在命令改變的事情做到這一點?)

+0

您應該使用glReadPixels而不是通過glGetTexImage。原因有二:如果你想獲得主窗口的內容,glGetTexImage不被OpenGL-ES支持,而且glReadPixels甚至不需要經過FBO就可以工作。 – datenwolf 2015-04-01 10:05:51

+0

@datenwolf感謝您的信息。我會嘗試,但我不懷疑這會改變從ffmpeg – Dries 2015-04-01 10:08:22

+1

的輸出確實它不能解決你的問題,因此這是一個評論。 – datenwolf 2015-04-01 10:08:54

回答

0

最有可能的ffmpeg的方式讀取像素不匹配你走出的OpenGL的佈局。使用glPixelStorei和GL_PACK_ ...參數來鎖定OpenGL發出的佈局。

另一個問題可能是色彩空間。您必須確保ffmpeg在與OpenGL上下文相同的顏色空間中運行。如果沒有,您必須確定色彩空間並將轉換過濾器添加到ffmpeg的處理鏈中。

+0

我在'glBindTexture'和'glGetTexImage'調用之前添加了'glPixelStorei(GL_PACK_ALIGNMENT,1);',但它似乎沒有改變任何東西。任何想法如何設置轉換過濾器? (我試過用'-pix_fmt'但我無法找到一個修復它,我想這應該從原來的RGBA轉換爲YUV420P。) – Dries 2015-04-01 10:16:24

+0

@Dries:'ffmpeg的-pix_fmts'(注意在's'最後)列出了ffmpeg可以理解的所有像素格式。然而,像RGB這樣的格式並沒有很好的定義。例如,有不同的方法來應用伽馬曲線,設置主要點等。如果你真的想要安全起見,你應該首先將(使用OpenGL和着色器)轉換爲聯繫色彩空間(如Lab或XYZ)並將其傳遞給ffmpeg。或者轉換到YUV444(這也是很好的定義)並將其傳遞給ffmpeg。 ffmpeg可以爲你做YUV422的色度二次採樣。 – datenwolf 2015-04-01 12:32:02

+0

我不得不親自去做這件事(如果這確實是唯一的選擇)。我會猜想ffmpeg有處理這個 – Dries 2015-04-01 13:35:16