2009-01-26 168 views
3

我打算開發一個使用C++,Qt和OpenGL進行實時視頻處理的工具。視頻疊加不是一種選擇,因爲着色器應該用於幀處理。目前我想象的步驟的順序如下:如何使用GPU高效渲染和處理視頻流?

  1. 解碼視頻(CPU)
  2. 預處理它(可選,CPU)
  3. 它Transer到視頻存儲器(使用DMA GPU)
  4. 進一步處理它使用頂點和片段着色器(GPU)
  5. 渲染它(GPU)

我在找一些一般意見地名釋義是什麼的一些推廣或者工藝可爲U sed在這裏。是否有充分理由使用Direct3D?

回答

2

首先,在PC上沒有明確的方式來使用DMA。驅動程序可能使用,或可能使用其他內容。

無論如何,第3步將是「更改圖形卡上的紋理數據」。在OpenGL中,它是PBO(像素緩衝區對象)擴展或舊的glTexSubImage *功能。在D3D9中,它是紋理上的LockRect或其他方式(例如,抓取紋理上的LockRect,然後接入GPU紋理中)。任何這些可能會使用DMA,但你不能確定。

然後數據在紋理中。您可以使用某些着色器(例如,執行YCbCr轉換)將其渲染到屏幕上,或渲染到其他紋理中以執行更復雜的處理效果(例如模糊/發光/ ...)。

從某種意義上說,使用Direct3D更容易,因爲有明確定義的「做事方式」。在OpenGL中,有很多選項可以做任何事情,而且你必須弄清哪些是快速的(有時不同平臺或硬件上的快速路徑是不同的)。

0

作爲一種替代方案,您可以查看一些不同的語言來執行通用GPU編程(GPGPU),例如NVIDIA的CUDA或ATI的Stream SDK。不過,取決於您選擇的是哪一種,您可以將自己限制爲一種品牌的GPU。使用這些語言的原因是在接近正常高級編程的抽象級別工作,而不是使用着色器。

我對你想做什麼沒有經驗,所以我不能說如果着色器實際上更適合這項工作,但它是你可以考慮看的東西。不得不說,算法設計仍然與普通代碼有所不同,需要花費一些努力才能掌握它(我只使用過CUDA,但他們似乎都使用類似的抽象)。

我想如果你有一個體面的着色器工作經驗,它可能不值得你學習一個新的平臺的麻煩。

2

如果你是linux系統,NVIDIA最近在180.xx系列中的驅動已經通過VDPAU API(視頻解碼和演示)增加了對視頻解碼的支持。許多重大項目都與api集成在一起,包括mplayer,vlc,ffmpeg和mythtv。我不知道所有的細節,但他們提供了許多編解碼器的API,包括常見的子操作和比特流操作。

我想看看這裏之前去直接CUDA(我假設VDPAU可以使用)

1

對於幀數據從CPU轉移到GPU,你可能想在看向PBO秒。還請檢查this

此外,如果您使用着色器,您可以通過在片段着色器(YCbCr到RGB)中執行色彩空間轉換來緩解cpu負擔。

「進一步處理」和「渲染」步驟通常都是幾乎相同的事情,在着色器中做很酷的東西並將其融合到幀緩衝區。如果你想混合和匹配視頻和不同的效果,FBO也是有用的。

0

以下步驟應該這樣做:

  1. 解碼視頻,YUV

    這通常是什麼樣的解碼器庫做。

  2. 載入到OpenGL作爲紋理

  3. 轉換YUV到RGB

    既然你不想使用覆蓋,你必須手動轉換。 Here是一個使用着色器的例子。

  4. 放轉換在四紋理和渲染到屏幕