也用C#做個視頻監控用戶端來玩玩

來源:互聯網
上載者:User

   前幾天看到園友農民伯伯寫的C# 視頻監控系列實現了對海康板卡的封裝,這幾天參與的項目進入了後續階段了,現進行效能測試.測試流媒體伺服器的穩定性,並發性,看看並發處理300-500路視頻效果如何,部門沒有那麼多電腦用來測試,簡單寫了一個類比用戶端訪問的程式來測試服務端程式效能.流媒體是用C++語言實現的,我現在要使用C#與之通訊,會涉及下面幾個方面內容.舉例我現在想瀏覽前端大華的DVR/DVS上某一路視頻,這裡我們採用流媒體串連視頻監控裝置而非用戶端去直連裝置,流媒體接收到資料後再一一轉寄給當前想預覽該路視頻的用戶端,用戶端使用大華的PlaySDK解碼播放.(至於通過大華NetSDK直連裝置,你可以到大華網站下載其SDK包,當前最新版本好像是3.4,有提供封裝好的C#訪問Demo程式;這裡流媒體支援多種廠商的監控裝置的接入,包含海康,大華等)

用戶端視頻預覽一般過程

1)如果當前已有畫面正在預覽,發送停止正在預覽該路畫面命令到服務端,關閉該路視頻

一般調用PLAY_StopSound,PLAY_Stop,PLAY_CloseStream函數停止該路視頻預覽

2)發送視頻預覽請求

開啟視頻輸入資料流PLAY_OpenStream,PLAY_Play,PLAY_PlaySound(同時開啟音頻);然後可以專門開一視頻資料接收線程,把接收到視頻資料提供給函數PLAY_InputData解碼播放即可

   一般C++下我們進行網路傳輸模組開發,會採用結構體來封裝組織通訊報文,那採用C#開發的流媒體用戶端程式需與服務端流媒體通訊,就會碰到怎麼把一個結構體轉成一個byte數組,以及如何把收到的byte數組資料還原成結構體對象.我們這裡就涉及到了C#與其它語言的互操作,也就是所謂的P/Invoke技術,主要也就是System.Runtime.InteropServices命名空間下的Marshal類的使用.(可參考園友tuyile006文章struct和byte[]相互轉換(用Marshal類實現))還有就是C++與C#之間資料類型轉換如unsigned char-->byte,char * -->string,HWND-->IntPtr,LONG/DWORD-->int,傳遞null 指標使用IntPtr.Zero等(農民伯伯在其C# 視頻監控系列(14):總結貼——VC++代碼轉成C#小結也做了一些介紹,可借鑒C#封裝的海康DVR用戶端SDK )

  接下來就實現代碼,編譯通過,運行一下.呀,彈出了一個提示在所指定的dll檔案中找不到某函數的入口地址,檢查代碼,原來太粗心把函數PLAY_OpenStream定義成了Play_OpenStream,汗一個先,以後寫程式要注意.(函數調用不成功,一般是函數定義錯誤,如函數名稱或參數資料類型錯誤,可參考文章BugHunter 也談c#調用C++的DLL找不到進入點 )最終效果如,很粗劣,大家不要見笑,畫面1傳輸是檔案流,畫面2是即時視頻流資料.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.