欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

WPF中在攝像頭視頻上疊加控件的解決方案

 更新時(shí)間:2017年04月11日 14:17:53   作者:納邊  
前段時(shí)間,在一個(gè)wpf的項(xiàng)目中需要實(shí)時(shí)顯示ip攝像頭,對(duì)此的解決方案想必大家都應(yīng)該知道很多。今天小編給大家?guī)?lái)了WPF中在攝像頭視頻上疊加控件的解決方案,一起看看吧

說(shuō)道WPF想必有很多朋友跟小編一樣不知道wpf是什么,今天小編就給大家簡(jiǎn)單普及下基本概念。

WPF(Windows Presentation Foundation)是微軟推出的基于Windows 的用戶(hù)界面框架,屬于.NET Framework 3.0的一部分。它提供了統(tǒng)一的編程模型、語(yǔ)言和框架,真正做到了分離界面設(shè)計(jì)人員與開(kāi)發(fā)人員的工作;同時(shí)它提供了全新的多媒體交互用戶(hù)圖形界面。

一、視頻呈現(xiàn)

  前段時(shí)間,在一個(gè)wpf的項(xiàng)目中需要實(shí)時(shí)顯示ip攝像頭,對(duì)此的解決方案想必大家都應(yīng)該知道很多。在winform中,我們可以將一個(gè)控件(一般用panel或者pictruebox)的句柄丟給攝像頭的sdk以實(shí)現(xiàn)該功能,而在wpf中我們同樣可以使用該方案快速實(shí)現(xiàn)。

  我們以??灯脚_(tái)為例,海康的sdk就需要我們傳遞一個(gè)控件的句柄,winform中可以直接使用控件的handle屬性來(lái)獲取句柄,而在wpf中我們則有兩種方法:

  1、將WindowsFormsHost作為容器在內(nèi)部嵌套一個(gè)winform控件,比如panel,這樣的話就和winform中一樣了;

  2、直接使用    ((HwndSource)PresentationSource.FromVisual(你的wpf元素)).Handle;  獲取句柄;

二、疊加控件

  簡(jiǎn)單的視頻展示使用一中的方案就可以解決,但我接手的項(xiàng)目是一個(gè)將攝像頭視頻用以AR處理的程序,界面上需要展示很多圖標(biāo)和信息欄,最重要的是整個(gè)主程序的大背景就是實(shí)時(shí)的攝像頭畫(huà)面,除此之外還有各種子窗口,子窗口中也要用到視頻,這樣就必然涉及到在視頻畫(huà)面上疊加控件的難題?! ?/p>

  1、使用Microsoft.DwayneNeed

  之所以說(shuō)是難題,是微軟也在試圖解決卻也沒(méi)有給出真正完美的解決方案。這個(gè)難題就是著名的空域問(wèn)題(airspace issues)。這里有一份園友的隨筆鏈接,主要介紹的是微軟目前的解決方案:http://www.dbjr.com.cn/article/110896.htm,這套方案在我實(shí)際使用中雖然可以正常的在視頻上疊加控件,但在上方拖動(dòng)控件則非常卡頓,通常的情況就是鼠標(biāo)已經(jīng)移動(dòng)到了右側(cè),被拖控件還在左側(cè)依依不舍,即便是release版本也無(wú)濟(jì)于事,這套方案最終流產(chǎn)。 

  2、將視頻流轉(zhuǎn)碼,使用d3d渲染為ImageSource

  此方案比較麻煩,需要自己控制轉(zhuǎn)碼過(guò)程,這里有一篇關(guān)于此方案的文章鏈接:http://www.dbjr.com.cn/article/110898.htm,我這里準(zhǔn)備了一份demo(非本人編寫(xiě)):https://pan.baidu.com/s/1i59OZC5,以下是demo運(yùn)行的截圖:

  大致的原理就是利用sdk的回調(diào)機(jī)制逐幀獲取碼流,再使用direct進(jìn)行渲染;

  此方案除了代碼量相對(duì)多點(diǎn)之外還存在和1中同樣的問(wèn)題,控件拖動(dòng)時(shí)依然卡頓,各位園友不知有何好的解決辦法呢。

  3、最終的解決方案

  在1和2都達(dá)不到理想中的要求時(shí),我突然意識(shí)到一個(gè)問(wèn)題,為什么會(huì)出現(xiàn)空域問(wèn)題?那是因?yàn)閣inform和wpf的渲染方式不同,如果將他們統(tǒng)一,問(wèn)題是不是解決了?只能說(shuō)解決了一半,如果需要疊加的控件是規(guī)規(guī)矩矩的矩形,換句話說(shuō),不需要透明通道的那些控件,則完全可以使用這套方案,但是像那些有圓角的控件還需要另外想辦法,我們先說(shuō)前者吧,簡(jiǎn)單的代碼如下:

<wfi:WindowsFormsHost>
 <wf:Panel/>
</wfi:WindowsFormsHost>
<wfi:WindowsFormsHost Width="114" Height="152">
  <ElementHost>
    <Border Width="114" Height="152"/>
  </ElementHost>
</wfi:WindowsFormsHost>

  其實(shí)就是在 WindowsFormsHost再套一個(gè)ElementHost,現(xiàn)在無(wú)論是視頻的panel還是在其上方的border控件由于都被WindowsFormsHost所包含,所以border在渲染時(shí)不會(huì)被覆蓋到底層了。

  下面再談?wù)勎覀€(gè)人認(rèn)為最難的不規(guī)則控件的疊加方式,如果你能在wpf應(yīng)用中通過(guò)代碼讓W(xué)indowsFormsHost背景透明,那么你不需要再繼續(xù)往下看了,請(qǐng)你聯(lián)系我,我認(rèn)為這才是最好的解決方案,而接下來(lái)我要說(shuō)的方案可能會(huì)讓你們不屑,甚至嘲笑。

  我的辦法很簡(jiǎn)單,就是使用兩個(gè)窗口,底部窗口單獨(dú)顯示視頻,并設(shè)置為主窗口,頂部窗口設(shè)置AllowsTransparency="True",ShowInTaskbar="False",在顯示頂部窗口時(shí)使用showdialog而不是show,這樣能夠保證用戶(hù)永遠(yuǎn)在頂部窗口上操作,到不了視頻窗口。針對(duì)子窗口的情況,雖然可以用popup來(lái)模擬上述過(guò)程,但popup也有很多問(wèn)題,他默認(rèn)是置頂?shù)模袝r(shí)會(huì)給用戶(hù)帶來(lái)困惑,比如兩個(gè)子窗口重疊時(shí),明明帶視頻的那個(gè)窗口在底部,但由于其中的視頻部分使用的是popup來(lái)展示的,它居然會(huì)顯示在頂層窗口之上,完美實(shí)現(xiàn)了窗口洗牌的特效,除此之外你還需要通過(guò)特殊的偏移量才能控制popup的位置,鑒于此,我建議你單獨(dú)定制一個(gè)專(zhuān)門(mén)用來(lái)彈出信息的窗體,再將包含視頻的控件作為子元素傳入其中。

  最終的解決方案是結(jié)合這三種,由于主界面是個(gè)實(shí)時(shí)視頻大背景,所以任何拖動(dòng)的操作都不該延遲,所以主界面用了3號(hào)解決方案,而一些子界面不涉及到在上方拖動(dòng)的操作,則可以用1號(hào)方案,至于2號(hào)方案則可以用來(lái)兼容各大視頻平臺(tái),例如有些視頻平臺(tái)不支持句柄的傳入,則可以使用該方案。

以上所述是小編給大家介紹的WPF中在攝像頭視頻上疊加控件的解決方案,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

最新評(píng)論