C# 外接(网口)双摄像头视频获取
【注意事項】
------------------------------------
1. 更新設備網絡SDK時,SDK開發包【庫文件】里的HCNetSDK.dll、HCCore.dll、PlayCtrl.dll、SuperRender.dll、AudioRender.dll、HCNetSDKCom文件夾、ssleay32.dll、libeay32.dll、hlog.dll、hpr.dll、zlib1.dll、log4cxx.properties等文件均要加載到程序里面,【HCNetSDKCom文件夾】(包含里面的功能組件dll庫文件)需要和HCNetSDK.dll、HCCore.dll一起加載,放在同一個目錄下,且HCNetSDKCom文件夾名不能修改。
2. 如果自行開發軟件不能正常實現相應功能,而且程序沒有指定加載的dll庫路徑,請在程序運行的情況下嘗試刪除HCNetSDK.dll。如果可以刪除,說明程序可能調用到系統盤Windows->System32目錄下的dll文件,建議刪除或者更新該目錄下的相關dll文件;如果不能刪除,dll文件右鍵選擇屬性確認SDK庫版本。
3. 如按上述步驟操作后還是不能實現相應功能,請根據NET_DVR_GetLastError返回的錯誤號判斷原因。
4.適用型號:DS-2CD2D15DWD 2.8MM,DS-2CD6424FWD-20 3.7MM,DS-2CD6425FWD-20? 2.8MM B
5.dll和sdk可以上海康官網下載:https://www.hikvision.com/cn/download_61.html
?
Form1.cs:
using System; using System.Threading.Tasks; using System.Windows.Forms;namespace WindowsFormsApp1 {public partial class Form1 : Form{public Form1(){InitializeComponent();init();}public IntPtr PictureDev1Cam { get { return pictureBox1.Handle; } }public IntPtr PictureDev2Cam { get { return pictureBox2.Handle; } }IntPtr Cam1Handle = IntPtr.Zero;IntPtr Cam2Handle = IntPtr.Zero;Cam Camera1 = new Cam();Cam Camera2 = new Cam();static private string Cam1IP = "192.168.1.64";static private string Cam2IP = "192.168.1.61";void init(){Cam1Handle = PictureDev1Cam;Cam2Handle = PictureDev2Cam;}private void ConnectCamera(int whitch){string userName = "admin";string password = "a123456.";int PortCamera = 8000;if (whitch == 1){labelCamera1Status.Text = "攝像頭連接中...";Task.Run(() =>{if (!Camera1.ConnectCamera(Cam1IP, PortCamera, userName, password)){this.Invoke((Action)delegate { labelCamera1Status.Text = "攝像頭連接失敗"; });}else{this.Invoke((Action)delegate { labelCamera1Status.Text = ""; });Camera1.Preview(Cam1Handle);Camera1.AdjustMirrorPara(1);Cam1ReconnectTimer.Stop();}});}else{labelCamera2Status.Text = "攝像頭連接中...";Task.Run(() =>{if (!Camera2.ConnectCamera(Cam2IP, PortCamera, userName, password)){this.Invoke((Action)delegate { labelCamera2Status.Text = "攝像頭連接失敗"; });}else{this.Invoke((Action)delegate { labelCamera2Status.Text = ""; });Camera2.Preview(Cam2Handle);Camera2.AdjustMirrorPara(1);Cam2ReconnectTimer.Stop();}});}}private void Cam1ReconnectTimer_Tick(object sender, EventArgs e){ConnectCamera(1);}private void Cam2ReconnectTimer_Tick(object sender, EventArgs e){ConnectCamera(2);}private void Form1_Load(object sender, EventArgs e){}} }cam:
using System; using System.IO; using System.Runtime.InteropServices;namespace WindowsFormsApp1 {class Cam{private bool initSDK = false;private uint lastErr = 0;private string debugMessage = "";private bool err = false;private Int32 userID = -1;public bool Isconnected { get; private set; }UInt32 dwReturn = 0;Int32 nSize = 0;IntPtr ptrPicCfg;private CHCNetSDK.NET_DVR_CAMERAPARAMCFG_EX camPara = new CHCNetSDK.NET_DVR_CAMERAPARAMCFG_EX();private CHCNetSDK.NET_DVR_DEVICEINFO_V30 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V30();private Int32 realPlayHandle = -1;public bool ConnectCamera(string deviceIP, int port, string userName, string password){initSDK = CHCNetSDK.NET_DVR_Init();if (initSDK == false){lastErr = CHCNetSDK.NET_DVR_GetLastError();debugMessage = "初始化過程失敗, 錯誤碼:" + lastErr;err = true;return false;}else{CHCNetSDK.NET_DVR_SetLogToFile(3, Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SdkLog\\"), true);}CHCNetSDK.NET_DVR_DEVICEINFO_V30 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V30();userID = CHCNetSDK.NET_DVR_Login_V30(deviceIP, port, userName, password, ref DeviceInfo);if (userID < 0){lastErr = CHCNetSDK.NET_DVR_GetLastError();debugMessage = "注冊失敗, 錯誤碼:" + lastErr;err = true;return false;}Isconnected = true;return true;}public void AdjustMirrorPara(byte type){dwReturn = 0;nSize = Marshal.SizeOf(camPara);ptrPicCfg = Marshal.AllocHGlobal(nSize);Marshal.StructureToPtr(camPara, ptrPicCfg, false);if (CHCNetSDK.NET_DVR_GetDVRConfig(userID, 3368, DeviceInfo.byStartChan, ptrPicCfg, (uint)nSize, ref dwReturn)){camPara = (CHCNetSDK.NET_DVR_CAMERAPARAMCFG_EX)Marshal.PtrToStructure(ptrPicCfg, typeof(CHCNetSDK.NET_DVR_CAMERAPARAMCFG_EX));Marshal.FreeHGlobal(ptrPicCfg);camPara.byMirror = type;ptrPicCfg = Marshal.AllocHGlobal(nSize);Marshal.StructureToPtr(camPara, ptrPicCfg, false);if (!CHCNetSDK.NET_DVR_SetDVRConfig(userID, 3369, DeviceInfo.byStartChan, ptrPicCfg, (uint)nSize)){lastErr = CHCNetSDK.NET_DVR_GetLastError();debugMessage = "設置鏡像關閉失敗, 錯誤碼:" + lastErr;err = true;}}else{lastErr = CHCNetSDK.NET_DVR_GetLastError();debugMessage = "獲取參數失敗, 錯誤碼:" + lastErr;err = true;}Marshal.FreeHGlobal(ptrPicCfg);}public void Preview(IntPtr handle){CHCNetSDK.NET_DVR_PREVIEWINFO previewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO();previewInfo.hPlayWnd = handle;//預覽窗口previewInfo.lChannel = 1;//(int)DeviceInfo.byStartChan;//預覽的設備通道previewInfo.dwStreamType = 0;//碼流類型:0-主碼流,1-子碼流,2-碼流3,3-碼流4,以此類推previewInfo.dwLinkMode = 0;//連接方式:0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP previewInfo.bBlocked = true; //0- 非阻塞取流,1- 阻塞取流previewInfo.dwDisplayBufNum = 0; //播放庫播放緩沖區最大緩沖幀數//CHCNetSDK.REALDATACALLBACK RealData = new CHCNetSDK.REALDATACALLBACK(RealDataCallBack);//預覽實時流回調函數IntPtr pUser = new IntPtr();//用戶數據//打開預覽 Start live view realPlayHandle = CHCNetSDK.NET_DVR_RealPlay_V40(userID, ref previewInfo, null/*RealData*/, pUser);if (realPlayHandle < 0){lastErr = CHCNetSDK.NET_DVR_GetLastError();debugMessage = "預覽失敗, 錯誤碼:" + lastErr; //預覽失敗,輸出錯誤號err = true;//MessageBox.Show(str);return;}}} }CHCNetSDK.cs
這個太長,需要的可以上我的github下載,省略,我的賬號zyr365
工程文件
bin目錄
定時器:
運行結果:
----------------------------------------------------------
如果覺得有用,麻煩點擊 在看,讓更多志同道合的伙伴加入我們的交流群,一起共同進步!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
總結
以上是生活随笔為你收集整理的C# 外接(网口)双摄像头视频获取的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Worker Service
- 下一篇: 什么?他居然想在DLL中放毒!