2017-05-31 69 views
2

我有一串YUV數據(來自視頻文件),我想實時流到屏幕。 (基本上,我想寫一個能夠實時播放視頻的程序。)便攜式YUV繪圖環境

因此,我正在尋找一種將YUV數據發送到屏幕的便攜方式。我最好喜歡使用可移植的東西,所以我不必爲每個主要平臺重新實現它。

我發現了一些選項,但他們都似乎有重大問題。它們是:

  1. 直接使用OpenGL,將YUV數據轉換爲RGB。 (並且使用單個四合一技術實現全屏幕技巧)

這顯然不會工作,因爲在CPU上將RGB轉換爲YUV對於實時顯示圖像來說太慢了。

  1. 使用OpenGL,但使用着色器將YUV流轉換爲RGB。

該選項稍微好一點。 Although the problem here is that (afaict), this will involve making two streams and splicing them together. It might work, but may have issues with larger resolutions.

  1. 改爲使用SDL,它可以直接創建YUV上下文。

問題是我已經在爲我的程序的其他方面(如播放控件)使用跨平臺小部件庫。據我所知,SDL只在其(possibly borderless)窗口中打開。我會理想地喜歡我的控件和繪圖上下文在同一個窗口中。我可以用opengl做什麼,但不能用SDL。

  1. 使用SDL,並在屏幕上使用類似Qt的小部件,使用消息傳遞協議在兩個庫之間進行通信。 Have the (borderless) SDL window constantly move itself on top of the opengl window.

雖然這種方法很聰明,但似乎這兩個窗口很容易脫落,使用戶體驗不夠理想。

  1. 忘記一個跨平臺庫,請認爲操作系統具體,使用硬件加速,如果存在。

這是一個很好的解決方案,雖然它不是跨平臺。

因此,有沒有YUV數據繪製到一個屏幕,理想情況下沒有什麼好的辦法:

  1. 便攜式(至少在主要平臺)。
  2. 快到足以實時。
  3. 允許其他窗口小部件在同一窗口中。
+0

使用#2:使用1或3(取決於YUV數據的平面度)紋理,並在渲染紋理四邊形的同時在片段着色器中執行YUV→RGB轉換。 SDL_Renderer在[幕後]執行此操作(https://hg.libsdl.org/SDL/file/1f2cb42aa5d3/src/render/opengl/SDL_shaders_gl.c#l128)。 – genpfault

+0

此外,請注意:CPU端顏色轉換:['libswscale'](https://www.ffmpeg.org/libswscale.html),請參閱['ffplay']中的用法(https://ffmpeg.org/ffplay的.html)。 – genpfault

+0

Facepalm,謝謝你們倆。特別是@genpfault,現在我覺得有點笨,因爲我已經在應用程序中使用ffmpeg了... –

回答

1

使用選項編號2.在着色器中執行YUV到RGB轉換沒有問題。沒有這樣的其他「便攜」方式。

想一想:無論視頻是多大或多小,片段着色器(轉換完成的地方)都會在顯示時執行每個像素,因此您可以將一個小視頻全屏或大屏幕,計算(對於着色器)是相同的,因爲它們顯示相同數量的像素。

在正常情況下,任何顯卡都可以運行這種着色器,沒有任何問題。