亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

WPF下YUV播放的D3D解決方案

2024-07-10 13:32:16
字體:
來源:轉載
供稿:網友

在視頻媒體播放,監控系統的構建當中,經常會涉及到YUV數據的顯示問題。一般的播放控件以及SDK都是通過使用Window句柄,利用DirectDraw直接在窗口上渲染。但是,如果用戶界面是使用WPF開發的時候,通常只能通過WinFormHost在WPF界面中嵌入WinForm來完成。但這么做會遇到AeroSpace的問題,即winform的控件永遠浮在WPF的最上層,任何WPF元素都會被蓋住,同時縮放和拖動的時候都會造成很差的用戶體驗。原因是由于WPF和Winform使用了不同的渲染技術。

要在WPF中完美的支持YUV數據的顯示,通常的解決方式是使用先把YUV數據轉換成WPF可以支持的RGB數據,然后利用類似于WriteableBitmap的控件,把他展現在WPF上。這么做的主要問題是在做RGB轉換的時候,需要消耗大量的CPU, 效率比較低。一種優化方式是使用FFMPEG里的SwScale或者Intel的IPP庫,這些庫經過了一定的優化,可以有限度的使用硬件加速。下面為一個使用WritableBitmap的例子。

WriteableBitmap imageSource = new WriteableBitmap(videoWidth, videoHeight,  DPI_X, DPI_Y, System.Windows.Media.PixelFormats.Bgr32, null); ... int rgbSize = width * height * 4; // bgr32 IntPtr rgbPtr = Marshal.AllocHGlobal(rgbSize); YV12ToRgb(yv12Ptr, rgbPtr, width, height); // 更新圖像 imageSource.Lock(); Interop.Memcpy(this.imageSource.BackBuffer, rgbPtr, rgbSize); imageSource.AddDirtyRect(this.imageSourceRect); imageSource.Unlock(); Marshal.FreeHGlobal(rgbPtr); 

另一種解決方法是使用D3DImage作為WPF與顯卡的橋梁。我們可以借助D3DImage,直接將D3D渲染過后的部分送到WPF中顯示。一個參考就是VMR9在WPF中的應用。VMR9是微軟提供的DirectShow的Render。經過仔細參考了WpfMediaTookit中VMR9相關的代碼后,其核心的思想就是在初始化DirectShow構建VMR9渲染器時,讓其輸出一個D3D9Surface,D3DImage將使用該Surface作為BackBuffer。當有新的視頻幀在該Surface渲染完成后,VMR9將發送一個事件通知。收到通知后,D3DImage刷新一下BackBuffer即可。下面代碼展現了核心思想部分。

private VideoMixingRenderer9 CreateRenderer() {  var result = new VideoMixingRenderer9();  var cfg = result as IVMRFilterConfig9;  cfg.SetNumberOfStreams(1);  cfg.SetRenderingMode(VMR9Mode.Renderless);  var notify = result as IVMRSurfaceAllocatorNotify9;  var allocator = new Vmr9Allocator();  notify.AdviseSurfaceAllocator(m_userId, allocator);  allocator.AdviseNotify(notify);  // 在構建VMR9 Render時,注冊新視頻幀渲染完成事件  allocator.NewAllocatorFrame += new Action(allocator_NewAllocatorFrame);  // 注冊接收新D3DSurface被創建的事件  allocator.NewAllocatorSurface += new NewAllocatorSurfaceDelegate(allocator_NewAllocatorSurface);  return result;  }  void allocator_NewAllocatorSurface(object sender, IntPtr pSurface)  {   // 為了方便理解,只保留核心部分。省略改寫了其他部分   ...   // 將pSurface設置為D3DImage的BackBuffer   this.m_d3dImage.Lock();   this.m_d3dImage.SetBackBuffer(D3DResourceType.IDirect3DSurface9, pSurface);   this.m_d3dImage.Unlock();   ...  }  void allocator_NewAllocatorFrame()  {   ...   // 重繪   this.m_d3dImage.Lock();   this.m_d3dImage.AddDirtyRect(new Int32Rect(0, /* Left */     0, /* Top */     this.m_d3dImage.PixelWidth, /* Width */     this.m_d3dImage.PixelHeight /* Height */));   this.m_d3dImage.Unlock();   ...  } 

由此,只要是使用DirectShow的視頻播放就可以借助VMR9在WPF上完美顯示。但很多時候,DirectShow不能解決所有問題。例如在做交互式視頻優化處理或是視頻疊加的時候, 采用固定濾鏡流水線的DirectShow很難滿足要求。有的時候還是需要便捷的直接渲染的方式。

由VMR9的例子我們可以看出,產生出一個D3D9Surface并在上面渲染是其中的關鍵。那么剩下的問題就是如何把YUV數據渲染到D3D9Surface。

D3D沒有直接支持YUV圖像格式。因此需要我們想辦法讓D3D能夠渲染YUV數據。在用C#改寫的過程當中,我突然發現D3D已經提供了更簡單的方法幫助我們實現YUV到RGB顏色空間的轉換,而且是通過顯卡硬件直接支持。效率相當的高。主要原理就是借助D3DDevice的StrentchRectangle方法。

public void StretchRectangle(  Surface sourceSurface,  Rectangle sourceRectangle,  Surface destSurface,  Rectangle destRectangle,  TextureFilter filter ); 

StrentchRectangle方法的主要功能是將一個Surface上的某個區域的內容拷貝到另一個Surface的指定區域中。在Copy的過程當中,只要是顯卡直接支持的格式,如YV12,YUY2等等, 都會自動的進行D3D PixelFormat的轉換!因此,我們只需要創建一個指定好PixelFormat的D3D OffscreenPlainSurface, 把原始數據填充進去,調用StrentchRectangle向目標Surface拷貝,我們就得到了想要的Surface。剩下的事情就交給D3DImage了。下面是例子代碼的核心部分

public void Render(IntPtr imgBuffer) {  lock (this.renderLock)  {   // 將圖像數據填充進offscreen surface   this.FillBuffer(imgBuffer);   // 調用StrentchRectangle把原始圖像數據Copy到TextureSurface中           this.StretchSurface();   // 執行渲染操作   this.CreateScene();  }  // 通知D3DImage刷新圖像  this.InvalidateImage(); } 

以上所述是小編給大家介紹的WPF下YUV播放的D3D解決方案,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到ASP.NET教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩一区二区免费在线观看| 日韩av在线影视| 久久香蕉国产线看观看网| 久久久999精品视频| 日韩日本欧美亚洲| 亚洲第一色中文字幕| 国产精品专区h在线观看| 亚洲精品成人久久久| 欧美激情xxxx性bbbb| 97av在线视频| 国产精品久久久久久久久久ktv| 亚洲人成电影在线观看天堂色| 久久久久久91香蕉国产| 久久精品一偷一偷国产| 亚洲天堂成人在线| 国产中文欧美精品| 亚洲免费一级电影| 欧美激情一区二区三区久久久| 国产精品久久久久久久久粉嫩av| 成人国产精品久久久久久亚洲| 97精品国产91久久久久久| 欧美日韩午夜激情| 国内外成人免费激情在线视频网站| 欧美精品免费在线观看| 亚洲激情视频在线观看| 成人黄色免费在线观看| 欧美国产日韩精品| 一本色道久久88精品综合| 亚洲精品v欧美精品v日韩精品| 亚洲国产成人精品女人久久久| 久久伊人免费视频| 欧美成aaa人片免费看| 中文字幕日韩视频| 中文字幕日本欧美| 亚洲国产精品国自产拍av秋霞| 激情成人在线视频| 亚洲欧洲xxxx| 国产精品欧美一区二区三区奶水| 精品丝袜一区二区三区| 中文亚洲视频在线| 亚洲免费一在线| 国产成人精品在线观看| 日本一区二区在线免费播放| 亚州精品天堂中文字幕| 国产91色在线免费| 日韩禁在线播放| 视频在线观看一区二区| 国产精品日韩精品| 国产精品老牛影院在线观看| 成人网中文字幕| 欧美日韩亚洲激情| 性欧美xxxx交| 最新69国产成人精品视频免费| 日韩激情片免费| 亚洲视频电影图片偷拍一区| 日韩小视频网址| 亚洲黄一区二区| 成人激情春色网| 欧美激情精品久久久久久蜜臀| 岛国av一区二区| 亚洲精品久久久久中文字幕欢迎你| 精品福利在线视频| 欧美大码xxxx| 日韩av片永久免费网站| 韩国视频理论视频久久| 欧美亚洲在线视频| 2018日韩中文字幕| 成人免费看吃奶视频网站| 国产精品久久久久久久久久久久久久| 久久久久久久久久久久av| 8090理伦午夜在线电影| 亚洲wwwav| 久久久久久久久久久久av| 日韩在线激情视频| 免费成人高清视频| 欧美激情一级二级| 尤物yw午夜国产精品视频明星| 欧美性xxxx极品高清hd直播| 欧美电影在线观看高清| 91精品国产高清久久久久久| 亚洲石原莉奈一区二区在线观看| 久久九九热免费视频| 欧美肥老太性生活视频| 久久视频精品在线| 亚洲人成电影网站色xx| 欧美又大又硬又粗bbbbb| 国产精品69av| 久久伊人免费视频| 午夜美女久久久久爽久久| 懂色aⅴ精品一区二区三区蜜月| 国产欧美精品一区二区| 亚洲综合社区网| 亚洲国产小视频在线观看| 18久久久久久| 尤物99国产成人精品视频| 最近中文字幕mv在线一区二区三区四区| 欧美性在线观看| 成人午夜在线观看| 中文字幕在线精品| 97在线观看免费| 7777精品久久久久久| 亚洲新中文字幕| 欧美人与性动交a欧美精品| 国产成人91久久精品| 亚洲欧美在线播放| 亚洲免费中文字幕| 欧美又大粗又爽又黄大片视频| 最近2019年日本中文免费字幕| 日韩在线观看免费全集电视剧网站| 精品国产一区二区三区久久狼5月| 日韩美女av在线免费观看| 久久久久久久久久国产精品| 在线视频精品一| 国产成人高清激情视频在线观看| 国产精品第100页| 欧美电影免费观看高清完整| 97在线视频免费看| 国产一区二区激情| 亚洲一区美女视频在线观看免费| 欧美日韩中国免费专区在线看| 欧美日韩国产限制| 日本精品在线视频| 久热爱精品视频线路一| 97在线精品国自产拍中文| 国产亚洲精品日韩| 538国产精品一区二区在线| 亚洲自拍另类欧美丝袜| 菠萝蜜影院一区二区免费| 亚洲男人天堂久| 亚洲第一精品福利| 亚洲电影免费在线观看| 日韩有码片在线观看| 免费av一区二区| 国产69精品久久久久99| 国产欧美一区二区白浆黑人| 欧美丝袜美女中出在线| 亚州国产精品久久久| 久久精品中文字幕电影| 国产精品v片在线观看不卡| 国产精品欧美风情| 久久国产精品99国产精| 国语自产精品视频在免费| 国产一区二区三区视频| 欧美区二区三区| 国产精品一区=区| 最新91在线视频| 中文字幕欧美视频在线| 国产精品自拍偷拍视频| 一区二区三区日韩在线| 欧美精品www在线观看| 97精品国产aⅴ7777| 国产成人亚洲综合91| 欧美激情国产日韩精品一区18| 国产中文字幕91| 亚洲视频在线观看视频| 日韩国产精品一区| 国产视频福利一区| 国产日本欧美视频| 欧美日韩中文在线观看| 国外成人在线直播| 成人天堂噜噜噜| 亚洲人av在线影院| 国产精品日韩欧美大师| 精品久久久在线观看|