我有一串YUV數據(來自視頻文件),我想實時流到屏幕。 (基本上,我想寫一個能夠實時播放視頻的程序。)便攜式YUV繪圖環境
因此,我正在尋找一種將YUV數據發送到屏幕的便攜方式。我最好喜歡使用可移植的東西,所以我不必爲每個主要平臺重新實現它。
我發現了一些選項,但他們都似乎有重大問題。它們是:
- 直接使用OpenGL,將YUV數據轉換爲RGB。 (並且使用單個四合一技術實現全屏幕技巧)
這顯然不會工作,因爲在CPU上將RGB轉換爲YUV對於實時顯示圖像來說太慢了。
- 使用OpenGL,但使用着色器將YUV流轉換爲RGB。
- 改爲使用SDL,它可以直接創建YUV上下文。
問題是我已經在爲我的程序的其他方面(如播放控件)使用跨平臺小部件庫。據我所知,SDL只在其(possibly borderless)窗口中打開。我會理想地喜歡我的控件和繪圖上下文在同一個窗口中。我可以用opengl做什麼,但不能用SDL。
- 使用SDL,並在屏幕上使用類似Qt的小部件,使用消息傳遞協議在兩個庫之間進行通信。 Have the (borderless) SDL window constantly move itself on top of the opengl window.
雖然這種方法很聰明,但似乎這兩個窗口很容易脫落,使用戶體驗不夠理想。
- 忘記一個跨平臺庫,請認爲操作系統具體,使用硬件加速,如果存在。
這是一個很好的解決方案,雖然它不是跨平臺。
因此,有沒有YUV數據繪製到一個屏幕,理想情況下沒有什麼好的辦法:
- 便攜式(至少在主要平臺)。
- 快到足以實時。
- 允許其他窗口小部件在同一窗口中。
使用#2:使用1或3(取決於YUV數據的平面度)紋理,並在渲染紋理四邊形的同時在片段着色器中執行YUV→RGB轉換。 SDL_Renderer在[幕後]執行此操作(https://hg.libsdl.org/SDL/file/1f2cb42aa5d3/src/render/opengl/SDL_shaders_gl.c#l128)。 – genpfault
此外,請注意:CPU端顏色轉換:['libswscale'](https://www.ffmpeg.org/libswscale.html),請參閱['ffplay']中的用法(https://ffmpeg.org/ffplay的.html)。 – genpfault
Facepalm,謝謝你們倆。特別是@genpfault,現在我覺得有點笨,因爲我已經在應用程序中使用ffmpeg了... –