我打算開發一個使用C++,Qt和OpenGL進行實時視頻處理的工具。視頻疊加不是一種選擇,因爲着色器應該用於幀處理。目前我想象的步驟的順序如下:如何使用GPU高效渲染和處理視頻流?
- 解碼視頻(CPU)
- 預處理它(可選,CPU)
- 它Transer到視頻存儲器(使用DMA GPU)
- 進一步處理它使用頂點和片段着色器(GPU)
- 渲染它(GPU)
我在找一些一般意見地名釋義是什麼的一些推廣或者工藝可爲U sed在這裏。是否有充分理由使用Direct3D?
我打算開發一個使用C++,Qt和OpenGL進行實時視頻處理的工具。視頻疊加不是一種選擇,因爲着色器應該用於幀處理。目前我想象的步驟的順序如下:如何使用GPU高效渲染和處理視頻流?
我在找一些一般意見地名釋義是什麼的一些推廣或者工藝可爲U sed在這裏。是否有充分理由使用Direct3D?
首先,在PC上沒有明確的方式來使用DMA。驅動程序可能使用,或可能使用其他內容。
無論如何,第3步將是「更改圖形卡上的紋理數據」。在OpenGL中,它是PBO(像素緩衝區對象)擴展或舊的glTexSubImage *功能。在D3D9中,它是紋理上的LockRect或其他方式(例如,抓取紋理上的LockRect,然後接入GPU紋理中)。任何這些可能會使用DMA,但你不能確定。
然後數據在紋理中。您可以使用某些着色器(例如,執行YCbCr轉換)將其渲染到屏幕上,或渲染到其他紋理中以執行更復雜的處理效果(例如模糊/發光/ ...)。
從某種意義上說,使用Direct3D更容易,因爲有明確定義的「做事方式」。在OpenGL中,有很多選項可以做任何事情,而且你必須弄清哪些是快速的(有時不同平臺或硬件上的快速路徑是不同的)。
作爲一種替代方案,您可以查看一些不同的語言來執行通用GPU編程(GPGPU),例如NVIDIA的CUDA或ATI的Stream SDK。不過,取決於您選擇的是哪一種,您可以將自己限制爲一種品牌的GPU。使用這些語言的原因是在接近正常高級編程的抽象級別工作,而不是使用着色器。
我對你想做什麼沒有經驗,所以我不能說如果着色器實際上更適合這項工作,但它是你可以考慮看的東西。不得不說,算法設計仍然與普通代碼有所不同,需要花費一些努力才能掌握它(我只使用過CUDA,但他們似乎都使用類似的抽象)。
我想如果你有一個體面的着色器工作經驗,它可能不值得你學習一個新的平臺的麻煩。
如果你是linux系統,NVIDIA最近在180.xx系列中的驅動已經通過VDPAU API(視頻解碼和演示)增加了對視頻解碼的支持。許多重大項目都與api集成在一起,包括mplayer,vlc,ffmpeg和mythtv。我不知道所有的細節,但他們提供了許多編解碼器的API,包括常見的子操作和比特流操作。
我想看看這裏之前去直接CUDA(我假設VDPAU可以使用)
以下步驟應該這樣做:
解碼視頻,YUV
這通常是什麼樣的解碼器庫做。
載入到OpenGL作爲紋理
轉換YUV到RGB
既然你不想使用覆蓋,你必須手動轉換。 Here是一個使用着色器的例子。
放轉換在四紋理和渲染到屏幕