海康威視Web3.0控件個人開發經驗及問題總結


最近在給公司平台寫視頻監控的頁面需求,於是接觸到了海康威視的視頻控件,網上查閱一番資料后,發現有很多大佬們給出了簡易的海康視頻控件的上手方法,但是發現仍然有很多地方沒有總結到,於是在這里對我個人對海康控件開發的經驗做出一點總結。話不多說現在開始。

運行環境與設備支持

海康控件開發包鏈接:

32位瀏覽器:

https://pan.baidu.com/s/160ia40-hlFd1MynbxSBI2Q  密碼:d3pf

64位瀏覽器:

https://pan.baidu.com/s/1TbNHqfZSw9PPS4Z-xYvcoQ  密碼:38qq

Web控件V3.0基於ActiveX和NPAPI開發,接口封裝於JavaScript腳本,以JavaScript接口形式提供用戶集成,支持網頁上實現預覽、回放、雲台控制等功能。該控件僅支持B/S開發,不適用C/S開發。

Web控件V3.0支持多種我司設備,包括DVR、NVR、DVS、網絡攝像機、網絡球機等,設備需要支持PSIA或ISAPI協議。

該控件所需運行環境:

操作系統:WindowsXP、Windows7、Windows8、Windows8.1(實際上目前Windows10也可以用)

瀏覽器:

IE8~IE11、Chrome31+、Firefox35+,32位瀏覽器

IE8~IE11、Chrome31~Chrome44、Firefox35~Firefox51,64位瀏覽器

(ps:這里其實有很大的坑,瀏覽器一旦版本位數沒有和插件對上,頁面顯示就會有問題,很多人沒看清這點盲目上手就踩在了這一點上)

demo

官方文檔給的demo其實有很多我們不需要的方法,這就需要我們二次開發時,有選擇的使用他所提供的方法

快速二次開發

其實這方面已經有很多人給過差不多的代碼,但我姑且還是在這里放一下簡易開發的代碼

首先是頁面文件,頁面需要導入官方的webVideoCtrl.js,建議將該文件放在官方給的codebase文件夾目錄下一同導入項目中,運行項目時,該文件會自動尋找同目錄下的其他文件。

<!doctype html>
<html>
<head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Cache-Control" content="no-cache, must-revalidate" />
    <meta http-equiv="Expires" content="0" />
    <script>
        document.write("<link type='text/css' href='css/demo.css?version=" + new Date().getTime() + "' rel='stylesheet' />");
    </script>
</head>
<body>
<div id="divPlugin" class="plugin"></div>
</body>
<script src="jquery-1.7.1.min.js"></script>
<script id="videonode" src="codebase/webVideoCtrl.js"></script>
<script src="test.js"></script>
</html>

接下來是js文件,其中四項參數username,password、ip、port分別對應登錄所必須的用戶名、密碼、設備ip及端口號

// 初始化插件
$(function() {
	initialValue = new Object();
	initialValue.g_iWndIndex = 0;
	initialValue.szDeviceIdentify = '';
	initialValue.deviceport = '';
	initialValue.rtspport = '';
	initialValue.channels = [];
	/*這里是登錄視頻插件所需的四項參數*/
	initialValue.ip = '';
	initialValue.port = '';
	initialValue.username = '';
	initialValue.password = '';
	t_init(initialValue);
	t_login(initialValue);
})
 
// 初始化
function t_init(initialValue) {
	// 檢查插件是否已經安裝過
	var iRet = WebVideoCtrl.I_CheckPluginInstall();
	if (-1 == iRet) {
		alert("您還未安裝過插件,雙擊開發包目錄里的WebComponentsKit.exe安裝!");
		return;
	}
	// 初始化插件參數及插入插件
	WebVideoCtrl.I_InitPlugin(500, 300, {
		bWndFull: true,
		iPackageType: 2,
		iWndowType: 1,
		cbInitPluginComplete: function() {
			WebVideoCtrl.I_InsertOBJECTPlugin("divPlugin");
		}
	});
}
 
function t_login(initialValue) {
	if ("" == initialValue.ip || "" == initialValue.port) {
		return;
	}
	initialValue.szDeviceIdentify = initialValue.ip + "_" + initialValue.port;
	WebVideoCtrl.I_Login(initialValue.ip, 1, initialValue.port, initialValue.username, initialValue.password, {
		success: function(xmlDoc) {
			setTimeout(function() {
				t_getChannelInfo(initialValue);
				t_getDevicePort(initialValue);
			}, 10);
			setTimeout(function() {
				t_StartRealPlay(initialValue);
			}, 500)
		},
		error: function(status, xmlDoc) {}
	});
}
 
// 獲取通道
function t_getChannelInfo(initialValue) {
	initialValue.channels = []
	if (null == initialValue.szDeviceIdentify) {
		return;
	}
	// 模擬通道
	WebVideoCtrl.I_GetAnalogChannelInfo(initialValue.szDeviceIdentify, {
		async: false,
		success: function(xmlDoc) {
			var oChannels = $(xmlDoc).find("VideoInputChannel");
			$.each(oChannels, function(i) {
				var id = $(this).find("id").eq(0).text(),
					name = $(this).find("name").eq(0).text();
				if ("" == name) {
					name = "Camera " + (i < 9 ? "0" + (i + 1) : (i + 1));
				}
				initialValue.channels.push({
					id: id,
					name: name
				})
			});
		},
		error: function(status, xmlDoc) {}
	});
	// 數字通道
	WebVideoCtrl.I_GetDigitalChannelInfo(initialValue.szDeviceIdentify, {
		async: false,
		success: function (xmlDoc) {
			var oChannels = $(xmlDoc).find("InputProxyChannelStatus");

			$.each(oChannels, function (i) {
				var id = $(this).find("id").eq(0).text(),
					name = $(this).find("name").eq(0).text(),
					online = $(this).find("online").eq(0).text()
				ip = $(this).find("ipAddress").eq(0).text(),
					port = $(this).find("port").eq(0).text();
				if ("false" == online) { // 過濾禁用的數字通道
					return true;
				}
				if ("" == name) {
					name = "IPCamera " + (i < 9 ? "0" + (i + 1) : (i + 1));
				}
				var arr = {
					"id": id,
					"title": name,
					"ipaddress": initialValue.szDeviceIdentify
				};
				IPaddress.push(arr);
			});
			console.log("獲取數字通道成功!");
		},
		error: function (status, xmlDoc) {
			console.log("獲取數字通道失敗!");
		}
	});
	// 零通道
	WebVideoCtrl.I_GetZeroChannelInfo(initialValue.szDeviceIdentify, {
		async: false,
		success: function (xmlDoc) {
			var oChannels = $(xmlDoc).find("ZeroVideoChannel");

			$.each(oChannels, function (i) {
				var id = $(this).find("id").eq(0).text(),
					name = $(this).find("name").eq(0).text();
				if ("" == name) {
					name = "Zero Channel " + (i < 9 ? "0" + (i + 1) : (i + 1));
				}
				if ("true" == $(this).find("enabled").eq(0).text()) { // 過濾禁用的零通道
					console.log("id:" + id + ",name:" + name);
				}
			});
			console.log("獲取零通道成功!");
		},
		error: function (status, xmlDoc) {
			console.log("獲取零通道失敗!");
		}
	});
}
 
// 獲取端口
function t_getDevicePort(initialValue) {
	if (null == initialValue.szDeviceIdentify) {
		return;
	}
	var oPort = WebVideoCtrl.I_GetDevicePort(initialValue.szDeviceIdentify);
	if (oPort != null) {
		initialValue.deviceport = oPort.iDevicePort;
		initialValue.rtspport = oPort.iRtspPort;
	}
}
 
// 開始預覽
function t_StartRealPlay(initialValue) {
	var oWndInfo = WebVideoCtrl.I_GetWindowStatus(initialValue.g_iWndIndex),//獲取當前窗口的狀態
		iChannelID = initialValue.channels[0].value
 
	if (null == initialValue.szDeviceIdentify) {
		return;
	}
 
	var startRealPlay = function() {
		WebVideoCtrl.I_StartRealPlay(initialValue.szDeviceIdentify, {
			iRtspPort: initialValue.rtspport,
			iStreamType: 1,
			iChannelID: iChannelID,
			bZeroChannel: false,
			success: function() {},
			error: function(status, xmlDoc) {
				if (403 === status) {} else {}
			}
		});
	};
 
	if (oWndInfo != null) { // 已經在播放了,先停止
		WebVideoCtrl.I_Stop({
			success: function() {
				startRealPlay();
			}
		});
	} else {
		startRealPlay();
	}
}

錯誤總結

首先,還是再強調一點,海康威視的插件時根據瀏覽器位數來的,而不是根據電腦系統位數,比如你用的64位系統,裝的32位瀏覽器,使用插件時就必須要使用32位插件。海康威視WEB3.0多版本開發控件中包含官方控件:CH_32位、CH_64位、以及CN_64位。其中還包含官方指定的測試瀏覽器火狐瀏覽器多版本,4.00/45.0/50.0.1  IE瀏覽器IE7  32位、64位,所以在進行二次開發時,一定要注意插件版本於瀏覽器是否適配的問題。

(1)頁面控制台報錯:/ISAPI/Security/sessionLogin/capabilities?username=admin Failed to load resource: the server responded with a status of 404 (Not Found)

    解決方法:引用js是否有問題,查看頁面js是否引入路徑,是否全面正確。

          使用的瀏覽器是否正確,仔細查閱官方注意事項中要求使用的瀏覽器。

          如果排查沒有上述錯誤,而且你使用的nginx,請查看壓縮文件中的nginx文件,配置你的nginx.conf內容,可以試着加上這一段,實現路徑的跳轉

location ~ /ISAPI|SDK/ {

    if ($http_cookie ~ "webVideoCtrlProxy=(.+)") {

           proxy_pass http://$cookie_webVideoCtrlProxy;

            break;

    }

}

  

(2)控制台報錯:TypeError: c.HWP_GetLocalConfig is not a function

    解決方法:這個報錯的原因是因為瀏覽器沒有激活插件,將其激活就行了。

(3)demo操作信息報錯:設備不支持Websocket取流!

      demo操作信息及控制台同時報錯:403錯誤

    解決方法:請換個瀏覽器。。。。。。請使用官方文檔給出的瀏覽器

(4)demo操作信息:獲取零通道失敗!(403, invalidOperation)

             獲取數字通道失敗!(403, invalidOperation)

             獲取模擬通道成功

             登錄成功

    解決方法:如果只是操作界面報錯而控制台沒有報錯,點擊開始預覽便能看到視頻了。。。

最后

剛開始進行二次開發海康控件時走了不少彎路,光顧着網上找資源了,忽略了官方文檔的查閱,現在回頭看來是浪費了不少時間。這篇博文作為我入職以來第一篇博文,對我來說也有着深刻警醒的意義,希望今后的我也能保持初心,時刻關注着技術,警醒自己不要止步、安於現狀。


免責聲明!

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



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