日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【DirectX3D - 5】渲染多路视频(单一窗口)

發布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【DirectX3D - 5】渲染多路视频(单一窗口) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述

windows 平臺下視頻渲染技術

  • GDI
    圖形設備接口(Graphics Device Interface)。主要任務是負責系統與繪圖程序之間的信息交換,處理所有Windows程序的圖形和圖像輸出。GDI的出現使程序員無需要關心硬件設備及設備正常驅動,就可以將應用程序的輸出轉化為硬件設備上的輸出和構成,實現了程序開發者與硬件設備的隔離,大大方便了開發工作。
    關于GDI的簡介可以閱讀這篇文章。

  • DirectDraw
    DirectDraw是微軟發行的DirectX SDK中的一部分。DirectDraw已經過時,取而代之的是Direct2D。
    Direct2D 是一種硬件加速的即時模式二維圖形 API,可為二維幾何對象、位圖和文本提供高性能、高質量的呈現。Direct2D API 可與使用 GDI、GDI+ 或 Direct3D 的現有代碼進行交互。

  • Direct3D
    Direct3D就是本文使用的渲染方式。我們在前文渲染圖片也講過了,主要有兩種渲染方法,一種是使用Surface,另一種是使用Texture。

  • OpenGL
    Open Graphics Library,開放圖形庫。
    用于渲染2D、3D矢量圖形的跨語言、跨平臺的應用程序編程接口(API)。這個接口由近350個不同的函數調用組成,用來繪制從簡單的圖形比特到復雜的三維景象。

  • 說明
    Direct3D 接口適用于 Windows平臺
    OpenGL 是跨平臺的。

    本文目的

    基于D3D技術,使用其中的紋理方法,實現僅創建一個窗口,渲染多路視頻。
    一般的,在視頻監控領域,顯示多個視頻,每一個視頻都是一個獨立的窗口。為了減少窗口的資源和管理,本文中介紹的方法是僅創建一個窗口,使用紋理內存的頂點映射方法,在一個大窗口中顯示不同路的視頻。

    實現步驟

    基本步驟

  • 創建大窗口
  • 創建統一的D3D設備資源
  • 將大窗口劃分為多個子區域,每一個子區域就是之后紋理內存映射的位置
  • 為紋理內存填充視頻數據
  • 統一刷新
  • 兩種方式

    實現方式分為兩種,單獨使用CPU渲染,單獨使用GPU渲染。
    兩種方式基本步驟一致。

    • CPU渲染,是因為解碼數據也是CPU實現的,視頻數據來源于CPU,然后直接使用CPU渲染。
    • GPU渲染,是因為解碼數據基于GPU實現,視頻數據來源于GPU顯存,不需要將顯存數據做DtoH的拷貝操作,直接使用GPU資源渲染,減少資源拷貝的實踐消耗。
    • 兩者的區別僅在于視頻數據的來源,以及是否需要注冊紋理資源。

    窗口說明


    舉例說明:
    上述1920x1080的窗口,要顯示16個小區域,紋理頂點映射要做的就是,將1920x1080的視頻分別映射到上述的每一個小區域中。
    這其實是一個大窗口,針對這一個大窗口,創建一個D3D設備,對于所有的畫面,執行統一的刷新(Present)。

    代碼說明

    本節將介紹關鍵代碼的使用和注意。

    // 數據結構 // 全局句柄 IDirect3D9* pD3D; IDirect3DDevice9* pDevice; // 刷新線程 pthread *pRenderThread;// 1. 創建設備 // CPU渲染方式 pD3D = Direct3DCreate9(D3D_SDK_VERSION); ret = pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, NULL,D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &(pDevice));// GPU 渲染方式 Direct3DCreate9Ex(D3D_SDK_VERSION, &(pDev->pD3DEx)); ret = pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, NULL,D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &(pDevice)); /*區別:GPU渲染必須 使用 HARDWARE 頂點映射格式:D3DCREATE_HARDWARE_VERTEXPROCESSING */// 2. 創建紋理,CPU和 GPU設置的格式不同,如下代碼 DWORD usage; D3DFORMAT format; D3DPOOL pool;if (E_CPU == iRendertype) {usage = D3DUSAGE_SOFTWAREPROCESSING;pool = D3DPOOL_MANAGED;format = D3DFMT_A8R8G8B8; } else if (E_GPU == iRendertype) {DWORD usage = D3DUSAGE_RENDERTARGET;D3DFORMAT format = D3DFMT_X8R8G8B8;D3DPOOL pool = D3DPOOL_DEFAULT; } ret = pDevice->CreateTexture(width, height, 1, usage, format, pool, &(pTexture), NULL);// GPU需要紋理注冊到GPU對應的顯存 /*pTexture:上一步驟申請的紋理空間cuResource:CUgraphicsResource cuResource; // cuda對應的d3d11紋理映射,pTexture要注冊到cuResource */ D3DLOCKED_RECT lr; pTexture->LockRect(0, &lr, NULL, 0); {// 省略了GPU上下文CUresult ret = cuGraphicsD3D9RegisterResource(&cuResource, pTexture, CU_GRAPHICS_REGISTER_FLAGS_NONE);ck(cuGraphicsResourceSetMapFlags(cuResource,CU_GRAPHICS_MAP_RESOURCE_FLAGS_WRITE_DISCARD)); } pTexture->UnlockRect(0);

    以上步驟基本就是渲染視頻的關鍵步驟。

    附錄

    渲染技術過去的歷史
    視頻渲染方法簡介:

    1、.視頻覆蓋:
      大概在1995年,當mpeg1(VCD)回放在PC上開始流行的時候,PC的處理能力還么有強大到實時播放的地步。顯卡制造廠商適時的推出了"video overlay(視頻覆蓋)"的技術。它就是種在顯卡上用硬件完成同時顯示幾個視頻的功能(拉伸,顏色空間變換,等等…)的技術,這樣就可以在PC上流暢的播放動畫而不占用cpu。視頻覆蓋的畫面質量事實上取決于顯卡硬件。我發現市面上的絕大部分的顯卡顯示視頻覆蓋質量都很不行。在視頻覆蓋上用視頻渲染技術的一個最大的關鍵就是在每個顯卡上只有一個視頻覆蓋 unit(單元). 這樣就迫切的需要多顯示器系統了。

    2、Direct3D:
      Direct3D是微軟提供給程序員使用一個不斷進化的功能集合的DirectX庫的一部分。在direct9 中,微軟給出了一套新的功能,性能接近于覆蓋 surface(接口),但是沒那么多限制。視頻渲染技術基于direct3d比視頻覆蓋提供了更好的圖像質量,還沒有視頻覆蓋單顯示器的麻煩。但是,不是所有的顯卡都支持這個技術,還有一些根本不支持,很多不支持整套功能集。

    3、系統默認渲染器:
      當播放器用默認回放模式播放媒體文件的時候,在低于windows xp的所有windows系統上或者windowsxp的"vmr7", 用系統默認渲染器就意味著"標準覆蓋" 。

    4、標準覆蓋渲染器:
      這是最老的視頻渲染技術了。在可用的時候它用到視頻覆蓋,當視頻不可用的時候就退回到純cpu控制視頻。純cpu控制就是說cpu替代了視頻覆蓋來干這些事情。這對回放是個沉重的打擊(cpu更辛苦了),這個渲染的缺點是它不支持固定屏幕高寬比控制,硬件顏色控制(色調/飽和度/亮度/對比度/gamma(灰度))不可操作,而且抓圖結果會很很奇怪。

    5、覆蓋混合渲染:
      同樣是運用視頻覆蓋技術,這個渲染器允許在那些支持顏色控制的硬件上進行顏色控制(色調/飽和度/亮度/對比度/gamma)。有些卡可能只支持顏色控制的一個子集(比如只有亮度)。這個渲染器也支持固定寬高比控制,只要媒體文件支持這個渲染器,缺點就是它返回到純cpu控制。當視頻覆蓋不可操作時,它就罷工了。在媒體模式的這個情況時候,就會回到標準覆蓋渲染。在dvd模式時,會報錯說視頻解碼器不能連接到覆蓋混合器。最后,這個渲染技術還是抓圖的效果不夠好。

    6、視頻混合渲染器7(vmr7):
      這個渲染器是視頻覆蓋技術和direct3d技術的結合,它只在windows xp上有效,后來被vmr9取代了。windows media player 7-10使用這個技術.這個渲染技術默認使用視頻覆蓋。然而,如果它不可用了,它可以有限的使用direct3d。它的缺點是不可進行顏色控制,截屏還是不夠好。

    7、視頻混合渲染器9(vmr9):
      這是最新的視頻渲染技術。它完全建筑在direct3d上,需要direct9和最新的硬件。它可以提供最好的畫質(取決于渲染模式和顯卡)。vmr9支持硬件顏色操作(如果卡支持),但是沒有gamma控制,因為ms沒有提供。 vmr9也有寬高比控制。

    8、EVR增強渲染模式(vista系統):
      Vista新引入了全新的EVR渲染器,微軟的技術文檔倒是把這個東東吹得很強勁,但是就目前來說問題還是不少。第一個就是字幕的問題,目前用EVR是無法在高速或者急速模式下把字幕顯示出來。那個EVR C/A 倒是能夠顯示字幕,不過dxva2.0就會失效,換句話說就無法開啟geforce8顯卡的硬件解碼功能。還有一個問題就是色階或者黑位問題,這個問題在VMR9下可以通過shader得到完美的解決方案,現在到了EVR,色階問題目前可以說幾乎毫無辦法,最多能用一下coreavc的fix color功能解決一下,但是還是有相當大的局限性。

    另:VMR9支持3種特別的渲染模式:
    A.vmr9:窗口:
      這種是最基本的模式,它向后兼容,但不支持幀抓屏,要提醒一點,這個模式在windows sp1和directx9b下有bug,在dvd菜單導航時只能用這個模式了。在windowsxp sp2和direct9c下這個bug沒了。
    B.wmr9:窗口無轉換:
      這個模式比窗口模式高級點,用來截圖是最好的。
    C.wmr9:渲染無轉換:
      這個可是vmr9中最復雜的渲染模式,它可以工作在direct3d獨占模式,那就是整個機器被設定為全屏,其他運行的程序不可以操作視頻硬件,在這個獨占模式下,所耗cpu更少,分辨率越高,回放就更平滑。缺點是在獨占模式下,整個機器都獻身給視頻回放了,你不能干其他任何事情了。

    參考資料

    [1] http://blog.sina.com.cn/s/blog_53902eeb010091qj.html
    [2] https://blog.csdn.net/CrystalShaw/article/details/91388983
    [3] 《CUDA Driver API》402頁

    總結

    以上是生活随笔為你收集整理的【DirectX3D - 5】渲染多路视频(单一窗口)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。