開源傾情奉獻:基於.NET打造IP智能網絡視頻監控系統 ---- 系列文章


基於.NET打造IP智能網絡視頻監控系統

本文為 Dennis Gao 原創技術文章,發表於博客園博客,未經作者本人允許禁止任何形式的轉載。

OptimalVision網絡視頻監控系統

OptimalVision(OV)網絡視頻監控系統(Video Surveillance System),是一套基於.NET、C#、WCF、WPF等技術構建的IP網絡視頻監控系統。設計與實現該系統的初衷是希望在家用電腦中部署該系統,連接本地或局域網設備,通過瀏覽器或手機客戶端瀏覽寶寶實時視頻,也就是俗稱的“寶寶在線”或“家庭看護”。

但由於業余時間總是有限,完成系統中的服務、配置、采集、傳輸和桌面GUI部分后,繼續完成后續移動客戶端的動力與興趣明顯減弱,尤其是寶寶出生后的很長一段時間內基本沒有進展,逐漸地演變為演練和測試所關注技術和模式的實驗性項目。

開源傾情奉獻系列鏈接

目錄

OV系統的設計要求

  • 系統平台要求部署在Windows操作系統,適宜家庭用戶安裝使用。
  • 系統服務需要支持自啟動、自發現、自組網功能,方便用戶使用。
  • 系統桌面客戶端需簡單易用,配置與瀏覽多路視頻方便。
  • 系統支持連接USB攝像頭、WebCam、JPEG攝像機、MJPEG攝像機等。
  • 攝像機可部署和接入在不同的主機電腦上,由桌面客戶端進行配置管理。
  • 系統提供基於HTTP發布的視頻和圖片,支持瀏覽器、移動客戶端訪問。

OV系統的技術選擇

  • 系統平台基於.NET/C#構建
  • 系統服務間采用WCF技術通信
  • 系統桌面客戶端采用WPF技術構建
  • 系統直接采用裸圖對幀率要求極低
  • 系統采用RTP封裝視頻數據包UDP傳輸
  • 系統提供HTTP REST API服務
  • 系統采用文件數據庫存儲數據
  • 系統支持瀏覽器和移動客戶端訪問

OV系統架構設計

OV系統已實現的服務

  • SVD:Service Discovery Service,負責系統中各服務的自發現和狀態偵測

  • DVC:Device Connector Service,負責攝像機設備的接入和視頻采集,可在多台機器部署

  • MPS:Media Publisher Service,負責選定攝像機視頻的發布,提供API訪問

OV系統主要業務流程

  • 客戶端登陸

  • 實時視頻瀏覽

OV桌面客戶端架構

 

OV桌面客戶端截圖

  • 登錄界面

  • 主界面菜單

  • 管理接入設備

  • 攝像機縮略圖

  • 新增攝像機

  • 支持設備種類

  • 選擇設備信息

  • 實時視頻列表

  • 實時視頻OSD

  • 多分屏視頻

  • 選擇發布服務器

  • 設置發布信息

  • 多語言

  • 多皮膚顏色

  • 藍色皮膚

  • 關於界面

本文為 Dennis Gao 原創技術文章,發表於博客園博客,未經作者本人允許禁止任何形式的轉載。

================================================================================================

開源傾情奉獻:基於.NET打造IP智能網絡視頻監控系統(一)開放源代碼

本文為 Dennis Gao 原創技術文章,發表於博客園博客,未經作者本人允許禁止任何形式的轉載。

開源傾情奉獻系列鏈接

這是什么系統?

OptimalVision(OV)網絡視頻監控系統(Video Surveillance System),是一套基於.NET、C#、WCF、WPF等技術構建的IP網絡視頻監控系統。設計與實現該系統的初衷是希望在家用電腦中部署該系統,連接本地或局域網設備,通過瀏覽器或手機客戶端瀏覽寶寶實時視頻,也就是俗稱的“寶寶在線”或“家庭看護”。

詳情參考博文《基於.NET打造IP智能網絡視頻監控系統》。

更多系統截圖請參考博文《基於.NET打造IP智能網絡視頻監控系統》。

為什么開源?

由於業余時間總是有限,完成系統中的服務、配置、采集、傳輸和桌面GUI部分后,繼續完成后續移動客戶端的動力與興趣明顯減弱,尤其是寶寶出生后的很長一段時間內基本沒有進展,逐漸地演變為演練和測試所關注技術和模式的實驗性項目。

總結了幾點開放源代碼的原因:

  • 社區分享。獨樂樂不如眾樂樂,孤獨腐朽的代碼沒有意義,與社區分享和探討也是一種樂趣。
  • 精力有限。利用業余時間構建,擠占的是陪家人和孩子的時間,要不也不會積累了三年。
  • 知識積累。據說自己查看六個月前寫的代碼,如果感覺需要改進,則就成長了。
  • 拓展視野。個人的視角總是短視,接受更多人的批評與指正,可以促進學習和拓展視野。

代碼在哪里?

代碼托管在 GitHub 網站,所有代碼基於 Microsoft .NET Framework 4.0 編譯。

代碼目錄結構

下面是源代碼目錄結構:

參考了哪些類庫?

下面羅列了系統所學習、引用、參考、改編、摘抄的開源類庫的不完全列表。

GitHub 本周上榜,感謝各位朋友的支持。

本文為 Dennis Gao 原創技術文章,發表於博客園博客,未經作者本人允許禁止任何形式的轉載。

=========================================================================================================

開源傾情奉獻:基於.NET打造IP智能網絡視頻監控系統(二)基礎類庫介紹

本文為 Dennis Gao 原創技術文章,發表於博客園博客,未經作者本人允許禁止任何形式的轉載。

開源傾情奉獻系列鏈接

基礎類庫介紹

基礎類庫目錄結構及名空間內容描述

  • Foundation
    • Common
      • Gimela.Common.Configuration - 配置文件處理
      • Gimela.Common.Consts - 系統常用恆量
      • Gimela.Common.Cultures - 系統 Culture 封裝
      • Gimela.Common.ExceptionHandling - 通用 Excepton 處理封裝
      • Gimela.Common.Logging - 通用 Logging 封裝
    • Data
    • Infrastructure
      • Gimela.Infrastructure.AsyncModel - 異步模型實現
      • Gimela.Infrastructure.Messaging - MVVM 消息通信機制
      • Gimela.Infrastructure.Patterns - 模式實現,包括 Flyweight,SmartQueue,WeakAction, Singleton 等
      • Gimela.Infrastructure.ResourceLocation - Service Locator 模式實現,參考《Service Locator 模式
      • Gimela.Infrastructure.Serialization - 常用序列化實現
    • Management
      • Gimela.Management - WMI 實現
    • Media
    • Net
      • Gimela.Net.Http - Http Server 實現,C# WebServer 移植
      • Gimela.Net.Rtp - RTP(RFC3550)實現
      • Gimela.Net.Sockets - TCP/UDP 通信實現
    • Presentation
      • Gimela.Presentation.Controls - WPF 通用控件實現
      • Gimela.Presentation.Shapes - 常用 WPF XMAL 形狀
      • Gimela.Presentation.Skins - WPF 皮膚實現
      • Gimela.Presentation.Transitions - WPF View 轉換實現
      • Gimela.Presentation.Windows - WPF Window 窗體的實現
    • Security
      • Gimela.Security - 加密及隨機數
    • ServiceModel
      • Gimela.ServiceModel.ChannelManagement - WCF 通道管理
      • Gimela.ServiceModel.ManagedDiscovery - WCF 服務自發現(WCF Discovery
      • Gimela.ServiceModel.ManagedHosting - WCF 服務宿主
      • Gimela.ServiceModel.ManagedService - WCF 托管服務
    • Streaming
    • Tasks
    • Text
      • Gimela.Text - 基於文本的處理
      • Gimela.Text.Validation - 文本驗證規則

本文為 Dennis Gao 原創技術文章,發表於博客園博客,未經作者本人允許禁止任何形式的轉載。

=========================================================================================================

開源傾情奉獻:基於.NET打造IP智能網絡視頻監控系統(三)命令行工具集

本文為 Dennis Gao 原創技術文章,發表於博客園博客,未經作者本人允許禁止任何形式的轉載。

開源傾情奉獻系列鏈接

命令行工具

為便於平時代碼管理和一些特殊需求,伴隨系統開發了一系列命令行工具,主要參考 Linux 系統 shell 命令實現。

  • addtext - 在文件的初始位置添加文本
  • base64 - 將字符串轉換為 Base64 編碼
  • cat - 顯示文件內容
  • checksum - 檢查文本或文件的校驗和
  • count - 檢索目錄中指定類型文件的數量
  • encode - 將文件編碼或更改編碼
  • env - 顯示系統環境變量信息
  • extract - 在所有文件中抽取符合模式匹配規則的文本
  • find - 在目錄中查找文件
  • grep - 在文件中查找符合模式匹配規則的行
  • head - 顯示文件內容的前幾行
  • join - 將多個文件合並成一個文件
  • kill - 殺掉進程
  • ls - 顯示目錄中的內容
  • ps - 顯示進程狀態
  • rm - 刪除文件
  • rmdir - 刪除目錄
  • rename - 重命名指定文件
  • replace - 在文件中替換文本
  • select - 在目錄中查找指定類型的文件
  • sort - 將文件中的文本排序
  • split - 將一個文件分割成多個文件
  • tail - 顯示文件的尾部內容
  • uniq - 移除文件中的重復行

擴展參考《C#開源文件實時監控工具Tail&TailUI

本文為 Dennis Gao 原創技術文章,發表於博客園博客,未經作者本人允許禁止任何形式的轉載。

=====================================================================================================

開源傾情奉獻:基於.NET打造IP智能網絡視頻監控系統(四)服務端介紹

本文為 Dennis Gao 原創技術文章,發表於博客園博客,未經作者本人允許禁止任何形式的轉載。

開源傾情奉獻系列鏈接

服務端介紹

目前在服務端實現了 4 個 WCF 服務:

  • ServiceDiscovery(簡稱 SVD)
  • DeviceConnector(簡稱 DVC)
  • DeviceProfile(簡稱 DPS)
  • MediaPublisher(簡稱 MPS)

服務建議啟動順序

  1. SVD - 服務發現目前有時后啟動不太穩定,暫時沒有調試這個問題。
  2. DVC
  3. DPS
  4. MPS

Service Discovery Service

SVD 服務實現 WCF Discovery ,當有服務上線時接收注冊,並通過服務接口實現向外提供檢索指定類型服務的功能。

復制代碼
1   [ServiceContract(SessionMode = SessionMode.Allowed)]
2   [ManagedServiceContract]
3   public interface IServiceDiscoveryService
4   {
5     [FaultContract(typeof(ServiceDiscoveryServiceFault))]
6     [OperationContract]
7     GetServicesResponse GetServices(GetServicesRequest request);
8   }
復制代碼

Device Connector Service

DVC 服務負責提供接口創建、連接、保活攝像機設備。

  1. 使用 Gimela.Data.MagpieDatabase 文檔數據庫進行本地數據存取。
  2. 使用 Gimela.Media.Video 進行媒體流數據的建立。
  3. 使用 Gimela.Net.Rtp 進行媒體流的封裝。
  4. 使用 Gimela.Net.Sockets 進行媒體流的傳輸。
  1   [ManagedServiceContractAttribute]
  2   [ServiceContract(SessionMode = SessionMode.Allowed, CallbackContract = typeof(IDeviceConnectorCallbackService))]
  3   public interface IDeviceConnectorService
  4   {
  5     /// <summary>
  6     /// 獲取攝像機源列表
  7     /// </summary>
  8     /// <param name="request"></param>
  9     /// <returns></returns>
 10     [OperationContract]
 11     [FaultContract(typeof(DeviceConnectorServiceFault))]
 12     GetCameraFiltersResponse GetCameraFilters(GetCameraFiltersRequest request);
 13     
 14     /// <summary>
 15     /// 獲取桌面源列表
 16     /// </summary>
 17     /// <param name="request"></param>
 18     /// <returns></returns>
 19     [OperationContract]
 20     [FaultContract(typeof(DeviceConnectorServiceFault))]
 21     GetDesktopFiltersResponse GetDesktopFilters(GetDesktopFiltersRequest request);
 22 
 23     /// <summary>
 24     /// 獲取指定的攝像機
 25     /// </summary>
 26     /// <param name="request"></param>
 27     /// <returns></returns>
 28     [OperationContract]
 29     [FaultContract(typeof(DeviceConnectorServiceFault))]
 30     GetCameraResponse GetCamera(GetCameraRequest request);
 31 
 32     /// <summary>
 33     /// 獲取全部的攝像機
 34     /// </summary>
 35     /// <param name="request"></param>
 36     /// <returns></returns>
 37     [OperationContract]
 38     [FaultContract(typeof(DeviceConnectorServiceFault))]
 39     GetCamerasResponse GetCameras(GetCamerasRequest request);
 40 
 41     /// <summary>
 42     /// 創建攝像機
 43     /// </summary>
 44     /// <param name="request"></param>
 45     /// <returns></returns>
 46     [OperationContract]
 47     [FaultContract(typeof(DeviceConnectorServiceFault))]
 48     CreateCameraResponse CreateCamera(CreateCameraRequest request);
 49 
 50     /// <summary>
 51     /// 修改攝像機
 52     /// </summary>
 53     /// <param name="request"></param>
 54     /// <returns></returns>
 55     [OperationContract]
 56     [FaultContract(typeof(DeviceConnectorServiceFault))]
 57     UpdateCameraResponse UpdateCamera(UpdateCameraRequest request);
 58 
 59     /// <summary>
 60     /// 刪除攝像機
 61     /// </summary>
 62     /// <param name="request"></param>
 63     /// <returns></returns>
 64     [OperationContract]
 65     [FaultContract(typeof(DeviceConnectorServiceFault))]
 66     DeleteCameraResponse DeleteCamera(DeleteCameraRequest request);
 67 
 68     /// <summary>
 69     /// 檢測攝像機
 70     /// </summary>
 71     /// <param name="request"></param>
 72     /// <returns></returns>
 73     [OperationContract]
 74     [FaultContract(typeof(DeviceConnectorServiceFault))]
 75     PingCameraResponse PingCamera(PingCameraRequest request);
 76 
 77     /// <summary>
 78     /// 獲取攝像機最新的快照圖像
 79     /// </summary>
 80     /// <param name="request"></param>
 81     /// <returns></returns>
 82     [OperationContract]
 83     [FaultContract(typeof(DeviceConnectorServiceFault))]
 84     GetCameraSnapshotResponse GetCameraSnapshot(GetCameraSnapshotRequest request);
 85 
 86     /// <summary>
 87     /// 獲取已發布攝像機的信息
 88     /// </summary>
 89     /// <param name="request"></param>
 90     /// <returns></returns>
 91     [OperationContract]
 92     [FaultContract(typeof(DeviceConnectorServiceFault))]
 93     GetPublishedCamerasResponse GetPublishedCameras(GetPublishedCamerasRequest request);
 94 
 95     /// <summary>
 96     /// 發布攝像機視頻流至指定接收器
 97     /// </summary>
 98     /// <param name="request"></param>
 99     /// <returns></returns>
100     [OperationContract]
101     [FaultContract(typeof(DeviceConnectorServiceFault))]
102     PublishCameraResponse PublishCamera(PublishCameraRequest request);
103 
104     /// <summary>
105     /// 取消發布攝像機視頻流
106     /// </summary>
107     /// <param name="request"></param>
108     /// <returns></returns>
109     [OperationContract]
110     [FaultContract(typeof(DeviceConnectorServiceFault))]
111     UnpublishCameraResponse UnpublishCamera(UnpublishCameraRequest request);
112 
113     /// <summary>
114     /// 發布的攝像機保活機制
115     /// </summary>
116     /// <param name="request">攝像機保活機制請求消息</param>
117     /// <returns>攝像機保活機制響應消息</returns>
118     [OperationContract]
119     [FaultContract(typeof(DeviceConnectorServiceFault))]
120     KeepPublishedCameraAliveResponse KeepPublishedCameraAlive(KeepPublishedCameraAliveRequest request);
121   }
View Code

Device Profile Service

DPS 服務暴露簡潔的接口,對外提供攝像機的基本信息,主要用以屏蔽或代理 DVC 服務。

 1   /// <summary>
 2   /// 設備信息服務接口
 3   /// </summary>
 4   [ManagedServiceContractAttribute]
 5   [ServiceContract(SessionMode = SessionMode.Allowed)]
 6   public interface IDeviceProfileService
 7   {
 8     /// <summary>
 9     /// 獲取全部攝像機的信息
10     /// </summary>
11     /// <param name="request">獲取全部攝像機的請求信息</param>
12     /// <returns>全部攝像機的響應信息</returns>
13     [OperationContract]
14     [FaultContract(typeof(DeviceProfileServiceFault))]
15     GetCamerasResponse GetCameras(GetCamerasRequest request);
16 
17     /// <summary>
18     /// 獲取攝像機的信息
19     /// </summary>
20     /// <param name="request">獲取攝像機的請求信息</param>
21     /// <returns>攝像機的響應信息</returns>
22     [OperationContract]
23     [FaultContract(typeof(DeviceProfileServiceFault))]
24     GetCameraResponse GetCamera(GetCameraRequest request);
25   }
View Code

Media Publisher Service

MPS 服務負責配置攝像機的媒體流的發布。

復制代碼
 1   [ManagedServiceContractAttribute]
 2   [ServiceContract(SessionMode = SessionMode.Allowed)]
 3   public interface IMediaPublisherService
 4   {
 5     /// <summary>
 6     /// 獲取已發布攝像機的信息
 7     /// </summary>
 8     /// <param name="request"></param>
 9     /// <returns></returns>
10     [OperationContract]
11     [FaultContract(typeof(MediaPublisherServiceFault))]
12     GetPublishedCamerasResponse GetPublishedCameras(GetPublishedCamerasRequest request);
13 
14     /// <summary>
15     /// 發布攝像機視頻流至指定接收器
16     /// </summary>
17     /// <param name="request"></param>
18     /// <returns></returns>
19     [OperationContract]
20     [FaultContract(typeof(MediaPublisherServiceFault))]
21     PublishCameraResponse PublishCamera(PublishCameraRequest request);
22 
23     /// <summary>
24     /// 取消發布攝像機視頻流
25     /// </summary>
26     /// <param name="request"></param>
27     /// <returns></returns>
28     [OperationContract]
29     [FaultContract(typeof(MediaPublisherServiceFault))]
30     UnpublishCameraResponse UnpublishCamera(UnpublishCameraRequest request);
31   }
復制代碼

本文為 Dennis Gao 原創技術文章,發表於博客園博客,未經作者本人允許禁止任何形式的轉載。

=============================================================================================

開源傾情奉獻:基於.NET打造IP智能網絡視頻監控系統(五)客戶端介紹

本文為 Dennis Gao 原創技術文章,發表於博客園博客,未經作者本人允許禁止任何形式的轉載。

開源傾情奉獻系列鏈接

客戶端介紹

系統 C/S 架構客戶端采用 WPF 技術並基於 MVVM 模式實現。

主要分為 3 部分:

  • Common - 通用控件、驗證規則等
  • Modules - 業務功能模塊
  • Applications - 最終呈現應用

業務功能模塊

  • UIMessage - MVVM 模式中的消息傳遞
  • Navigation - 系統導航菜單
  • SkinConfiguration - UI 皮膚設置
  • UserManagement - 系統登錄和用戶管理
  • DeviceConfiguration - 設備管理
  • LiveVideo - 實時視頻
  • PublishMedia - 媒體流發布
  • Widgets - 小部件,例如 About 頁面

服務連接

GUI 通過調用服務發現接口來獲取需要的服務連接。

復制代碼
 1 namespace Gimela.Rukbat.ServiceDiscovery.Contracts.ServiceContracts
 2 {
 3   [ManagedServiceContractAttribute]
 4   [ServiceContract(SessionMode = SessionMode.Allowed)]
 5   public interface IServiceDiscoveryService
 6   {
 7     [OperationContract]
 8     [FaultContract(typeof(ServiceDiscoveryServiceFault))]
 9     GetServicesResponse GetServices(GetServicesRequest request);
10   }
11 }
復制代碼

例如連接調用 DVC 服務:

復制代碼
1             GetCamerasResponse response =
2               ServiceProvider.GetService<IDeviceConnectorService, IDeviceConnectorCallbackService>(
3               ViewModelLocator.ServiceClient,
4               ViewModelLocator.SelectedService.HostName,
5               ViewModelLocator.SelectedService.Uri.ToString()
6               ).GetCameras(request);
復制代碼

本文為 Dennis Gao 原創技術文章,發表於博客園博客,未經作者本人允許禁止任何形式的轉載。

 

 

出處:https://www.cnblogs.com/gaochundong/tag/Video%20Surveillance/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM