须知:
引入3.2必要js文件
全局的config配置文件
var CONFIG_OBJ = {
Video_Total:null, //web3.2插件的所有方法
NVR_Data:{
ip:"192.168.12.68",
port:80,
userName:"admin",
passWord:"ht123456",
szDeviceIdentify:null, //格式:iP_port
streamType:2, //码流类型 1主码流 2子码流 3第三码流 4转码码流
rtspPort:null, //RTSP端口
currentChannel:{}, //当前选择的通道
allChannel:[], //已登录的全部通道
}
};
海康视频用到的相关方法,包括登录、预览、抓图、回放、录像、云台等功能
function showOPInfo(data,data1,data2) {
console.log(data,data1,data2)
}
function videoFunc() {
var that = this;
this.clickLogin = function clickLogin(paramObj) {
var szIP = paramObj.szIP,
szPort = paramObj.szPort,
szUsername = paramObj.szUsername,
szPassword = paramObj.szPassword;
if ("" == szIP || "" == szPort) {
return;
}
CONFIG_OBJ.NVR_Data.szDeviceIdentify = szIP + "_" + szPort;
var iRet = WebVideoCtrl.I_Login(szIP, 1, szPort, szUsername, szPassword, {
success: function () {
console.log(CONFIG_OBJ.NVR_Data.szDeviceIdentify + " 登录成功!");
that.getChannelInfo();
that.getDevicePort(paramObj.iWndIndex);
},
error: function (status, xmlDoc) {
console.log(CONFIG_OBJ.NVR_Data.szDeviceIdentify + " 登录失败!", status, xmlDoc);
}
});
if (-1 == iRet) {
showOPInfo(CONFIG_OBJ.NVR_Data.szDeviceIdentify + " 已登录过!");
that.getDevicePort(paramObj.iWndIndex);
}
};
// 窗口分割数
this.changeWndNum = function changeWndNum(iType) {
iType = parseInt(iType, 10);
WebVideoCtrl.I_ChangeWndNum(iType);
};
// 退出登录
this.clickLogout = function clickLogout() {
if (null == CONFIG_OBJ.NVR_Data.szDeviceIdentify) {
return;
}
var iRet = WebVideoCtrl.I_Logout(CONFIG_OBJ.NVR_Data.szDeviceIdentify);
if (0 == iRet) {
console.log("退出成功!");
CONFIG_OBJ.NVR_Data.szDeviceIdentify = null;
CONFIG_OBJ.NVR_Data.allChannel = [];
CONFIG_OBJ.NVR_Data.currentChannel = {};
CONFIG_OBJ.NVR_Data.rtspPort = null;
} else {
console.log("退出失败!");
}
};
//销毁
this.DestroyWorker = function DestroyWorker() {
WebVideoCtrl.I_DestroyWorker();
};
// 获取端口
this.getDevicePort = function getDevicePort(g_iWndIndex) {
showOPInfo("开始获取端口");
if (null == CONFIG_OBJ.NVR_Data.szDeviceIdentify) {
return;
}
var oPort = WebVideoCtrl.I_GetDevicePort(CONFIG_OBJ.NVR_Data.szDeviceIdentify);
showOPInfo(oPort);
if (oPort != null) {
//默认播放第一个通道的视频
// that.clickStartRealPlay(g_iWndIndex);
CONFIG_OBJ.NVR_Data.rtspPort = oPort.iRtspPort;
}
};
//获取通道
this.getChannelInfo = function getChannelInfo() {
// oSel = $("#channels").empty();
CONFIG_OBJ.NVR_Data.allChannel = [];
CONFIG_OBJ.NVR_Data.currentChannel = {};
if (null == CONFIG_OBJ.NVR_Data.szDeviceIdentify) {
return;
}
// 模拟通道
WebVideoCtrl.I_GetAnalogChannelInfo(CONFIG_OBJ.NVR_Data.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));
}
CONFIG_OBJ.NVR_Data.allChannel.push({
id:id,
name:name,
bZero:false
});
// oSel.append("");
});
//默认选中第一个通道
CONFIG_OBJ.NVR_Data.currentChannel = CONFIG_OBJ.NVR_Data.allChannel[0];
showOPInfo(CONFIG_OBJ.NVR_Data.szDeviceIdentify + " 获取模拟通道成功!");
},
error: function (status, xmlDoc) {
showOPInfo(CONFIG_OBJ.NVR_Data.szDeviceIdentify + " 获取模拟通道失败!", status, xmlDoc);
}
});
// 数字通道
WebVideoCtrl.I_GetDigitalChannelInfo(CONFIG_OBJ.NVR_Data.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(),
ipAddress = $(this).find("ipAddress").eq(0).text(),
online = $(this).find("online").eq(0).text();
if ("false" == online) {// 过滤禁用的数字通道
return true;
}
if ("" == name) {
name = "IPCamera " + (i < 9 ? "0" + (i + 1) : (i + 1));
}
CONFIG_OBJ.NVR_Data.allChannel.push({
id:id,
name:name,
bZero:false,
ip:ipAddress
});
// oSel.append("");
});
//默认选中第一个通道
CONFIG_OBJ.NVR_Data.currentChannel = CONFIG_OBJ.NVR_Data.allChannel[0];
showOPInfo(CONFIG_OBJ.NVR_Data.szDeviceIdentify + " 获取数字通道成功!");
},
error: function (status, xmlDoc) {
showOPInfo(CONFIG_OBJ.NVR_Data.szDeviceIdentify + " 获取数字通道失败!", status, xmlDoc);
}
});
// 零通道
WebVideoCtrl.I_GetZeroChannelInfo(CONFIG_OBJ.NVR_Data.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()) {// 过滤禁用的零通道
CONFIG_OBJ.NVR_Data.allChannel.push({
id:id,
name:name,
bZero:true
});
// oSel.append("");
}
});
//默认选中第一个通道
CONFIG_OBJ.NVR_Data.currentChannel = CONFIG_OBJ.NVR_Data.allChannel[0];
showOPInfo(CONFIG_OBJ.NVR_Data.szDeviceIdentify + " 获取零通道成功!");
},
error: function (status, xmlDoc) {
showOPInfo(CONFIG_OBJ.NVR_Data.szDeviceIdentify + " 获取零通道失败!", status, xmlDoc);
}
});
};
// 开始预览
this.clickStartRealPlay = function clickStartRealPlay(g_iWndIndex) {
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(g_iWndIndex);
if (null == CONFIG_OBJ.NVR_Data.szDeviceIdentify) {
return;
}
var startRealPlay = function () {
WebVideoCtrl.I_StartRealPlay(CONFIG_OBJ.NVR_Data.szDeviceIdentify, {
iWndIndex: g_iWndIndex,
iRtspPort: CONFIG_OBJ.NVR_Data.rtspPort,
iStreamType: CONFIG_OBJ.NVR_Data.streamType,
iChannelID: CONFIG_OBJ.NVR_Data.currentChannel.id,
bZeroChannel: CONFIG_OBJ.NVR_Data.currentChannel.bZero,
success: function () {
console.log("开始预览成功!");
that.clickEnableEZoom(g_iWndIndex);
},
error: function (status, xmlDoc) {
if (403 === status) {
console.log("设备不支持Websocket取流!");
} else {
console.log("开始预览失败!");
}
}
});
};
if (oWndInfo != null) {// 已经在播放了,先停止
console.log("已经在播放了,先停止");
WebVideoCtrl.I_Stop({
success: function () {
startRealPlay();
},error:function () {
console.log("shibai")
}
});
} else {
startRealPlay();
}
};
//停止预览(防止多窗口预览同一视频退出登录未停止播放)
this.clickStopPreview = function clickStopPreview(windowIndex) {
WebVideoCtrl.I_Stop({
iWndIndex:windowIndex,
success: function () {
console.log("停止播放成功"+windowIndex)
}
});
};
// 抓图
this.clickCapturePic = function clickCapturePic(g_iWndIndex,fn) {
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(g_iWndIndex);
if (oWndInfo != null) {
var szPicName = oWndInfo.szDeviceIdentify + "_" + new Date().getTime() + ".jpg";
WebVideoCtrl.I2_CapturePic(szPicName, {
bDateDir: true //是否生成日期文件
}).then(function(){
console.log("抓图成功");
fn(szPicName);
},function(){
console.log("抓图失败")
});
}
};
// 启用电子放大
this.clickEnableEZoom = function clickEnableEZoom(g_iWndIndex) {
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(g_iWndIndex);
if (oWndInfo != null) {
var iRet = WebVideoCtrl.I_EnableEZoom(g_iWndIndex);
if (0 == iRet) {
console.log("启用电子放大成功");
} else {
console.log("启用电子放大失败");
}
}
};
// 开始录像
this.clickStartRecord = function clickStartRecord(g_iWndIndex) {
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(g_iWndIndex);
if (oWndInfo != null) {
var szFileName = oWndInfo.szDeviceIdentify + "_" + new Date().getTime();
WebVideoCtrl.I_StartRecord(szFileName, {
bDateDir: true, //是否生成日期文件
success: function () {
console.log("开始录像成功!")
},
error: function () {
console.log("开始录像失败!")
}
});
}
};
// 停止录像
this.clickStopRecord = function clickStopRecord(g_iWndIndex) {
console.log("停止录像方法");
console.log(g_iWndIndex);
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(g_iWndIndex);
console.log(oWndInfo);
if (oWndInfo != null) {
WebVideoCtrl.I_StopRecord({
success: function () {
console.log("停止录像成功!")
},
error: function () {
console.log("停止录像失败!")
}
});
}
};
this.g_bPTZAuto = false;
// 云台控制
this.mouseDownPTZControl = function mouseDownPTZControl(iPTZIndex,g_iWndIndex) {
showOPInfo("云台操作!");
console.log(iPTZIndex,g_iWndIndex);
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(g_iWndIndex),
iPTZSpeed = 4;
console.log(oWndInfo);
if (oWndInfo != null) {
if (9 == iPTZIndex && this.g_bPTZAuto) {
iPTZSpeed = 0;// 自动开启后,速度置为0可以关闭自动
} else {
this.g_bPTZAuto = false;// 点击其他方向,自动肯定会被关闭
}
console.log(iPTZIndex)
WebVideoCtrl.I_PTZControl(iPTZIndex, false, {
iPTZSpeed: iPTZSpeed,
success: function (xmlDoc) {
if (9 == iPTZIndex && this.g_bPTZAuto) {
showOPInfo(oWndInfo.szDeviceIdentify + " 停止云台成功!");
} else {
showOPInfo(oWndInfo.szDeviceIdentify + " 开启云台成功!");
}
if (9 == iPTZIndex) {
this.g_bPTZAuto = !this.g_bPTZAuto;
}
},
error: function (status, xmlDoc) {
showOPInfo(oWndInfo.szDeviceIdentify + " 开启云台失败!", status, xmlDoc);
}
});
}
};
this.mouseUpPTZControl = function mouseUpPTZControl(g_iWndIndex) {
console.log("鼠标抬起")
console.log(g_iWndIndex)
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(g_iWndIndex);
console.log(oWndInfo)
if (oWndInfo != null) {
WebVideoCtrl.I_PTZControl(1, true, {
success: function (xmlDoc) {
console.log("成功")
showOPInfo(oWndInfo.szDeviceIdentify + " 停止云台成功!");
},
error: function (status, xmlDoc) {
console.log("失败")
showOPInfo(oWndInfo.szDeviceIdentify + " 停止云台失败!", status, xmlDoc);
}
});
}
};
// 开始回放
this.clickStartPlayback = function clickStartPlayback(g_iWndIndex,startTime,endTime) {
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(g_iWndIndex),
szDeviceIdentify = CONFIG_OBJ.NVR_Data.szDeviceIdentify,
iRtspPort = CONFIG_OBJ.NVR_Data.rtspPort,
iStreamType = CONFIG_OBJ.NVR_Data.streamType,
bZeroChannel = CONFIG_OBJ.NVR_Data.currentChannel.bZero,
iChannelID = CONFIG_OBJ.NVR_Data.currentChannel.id,
szStartTime = startTime,
szEndTime = endTime,
bChecked = false, //不启用转码码流
iRet = -1;
if (null == szDeviceIdentify) {
return;
}
if (bZeroChannel) {// 零通道不支持回放
return;
}
var startPlayback = function () {
WebVideoCtrl.I_StartPlayback(szDeviceIdentify, {
iRtspPort: iRtspPort,
iStreamType: iStreamType,
iChannelID: iChannelID,
szStartTime: szStartTime,
szEndTime: szEndTime,
success: function () {
console.log(szDeviceIdentify +"开始回放成功");
},
error: function (status, xmlDoc) {
if (403 === status) {
console.log(szDeviceIdentify +"设备不支持Websocket取流!");
} else {
console.log(szDeviceIdentify +"开始回放失败!");
}
}
});
};
if (oWndInfo != null) {// 已经在播放了,先停止
WebVideoCtrl.I_Stop({
success: function () {
startPlayback();
}
});
} else {
startPlayback();
}
};
// 停止回放
this.clickStopPlayback = function clickStopPlayback(g_iWndIndex){
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(g_iWndIndex);
if (oWndInfo != null) {
WebVideoCtrl.I_Stop({
success: function () {
console.log("停止回放成功!");
},
error: function () {
console.log("停止回放失败!");
}
});
}
};
// 暂停回放
this.clickPause = function clickPause(g_iWndIndex) {
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(g_iWndIndex);
if (oWndInfo != null) {
WebVideoCtrl.I_Pause({
success: function () {
console.log(oWndInfo.szDeviceIdentify + "暂停成功!");
},
error: function () {
console.log(oWndInfo.szDeviceIdentify + "暂停失败!");
}
});
}
};
//恢复回放
this.clickResume = function clickResume(g_iWndIndex) {
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(g_iWndIndex);
if (oWndInfo != null) {
WebVideoCtrl.I_Resume({
success: function () {
console.log(oWndInfo.szDeviceIdentify + "恢复成功!");
},
error: function () {
console.log(oWndInfo.szDeviceIdentify + "恢复失败!");
}
});
}
};
// 慢放
this.clickPlaySlow = function clickPlaySlow(g_iWndIndex) {
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(g_iWndIndex);
if (oWndInfo != null) {
WebVideoCtrl.I_PlaySlow({
success: function () {
console.log(oWndInfo.szDeviceIdentify + "慢放成功!");
},
error: function () {
console.log(oWndInfo.szDeviceIdentify + "慢放失败!");
}
});
}
};
// 快放
this.clickPlayFast = function clickPlayFast(g_iWndIndex) {
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(g_iWndIndex);
if (oWndInfo != null) {
WebVideoCtrl.I_PlayFast({
success: function () {
showOPInfo(oWndInfo.szDeviceIdentify + "快放成功!");
},
error: function () {
showOPInfo(oWndInfo.szDeviceIdentify + "快放失败!");
}
});
}
}
}
export {videoFunc}
赋值全局变量
this.$url.Video_Total = new videoFunc();
将海康视频封装一个组件,方便项目中多个位置使用到视频
使用视频窗口的页面(引入海康组件)
import HikVideo from "@/components/common/hik_video" //引入上面的组件
//初始化视频
initVideo(){
this.$refs.HikVideoRef.initPlugin(); //初始化视频插件
//登录nvr
let obj = {
szIP: CONFIG_OBJ.NVR_Data.ip,
szPort: CONFIG_OBJ.NVR_Data.port,
szUsername:CONFIG_OBJ.NVR_Data.userName,
szPassword:CONFIG_OBJ.NVR_Data.passWord,
iWndIndex: 0
};
this.$url.Video_Total.clickLogin(obj); //登陆视频
},
//预览视频
//CONFIG_OBJ.NVR_Data.allChannel是在登录的时候查询到的通道号数组存在全局
//查到当前的摄像头的ip对应的通道号 执行预览方法
var tempArr = CONFIG_OBJ.NVR_Data.allChannel.filter((item1)=>{
return item1.ip == that.allCamera[0].ip;
});
//如果当前的摄像头ip对应的视频通道正常 执行开始预览方法
if(tempArr && tempArr.length){
CONFIG_OBJ.NVR_Data.currentChannel = tempArr[0];
that.$url.Video_Total.clickStartRealPlay(0);
}
页面显示效果
遇到的坑:
1、确定客户提供的是IP地址还是监控点编号,或者是对接nvr。
提供IP地址的话不需要使用海康平台,使用web3.0控件开发包/web3.2控件开发包。
以上三种方式需要确认产品是否支持websockets协议,可以咨询 4008005998 的海康客服,如果不支持只能使用web3.0插件
web3.0:
功能全面但不支持谷歌浏览器
web3.2:
需要支持websocket取流
不支持直接将截图文件保存到对应的路径地址(ie对设置配置生效,谷歌不生效)
不支持双击全屏
不支持自动云台自转
不支持视频的快放慢放控制等(反正功能不太全)
2、如果对接完成但是预览视频特别卡
将主码流换成子码流
streamType 1主码流 2子码流 3第三方码流 4转码码流
3、单页面加载多个web3.2插件
需要使用iframe嵌套
4、web对接海康平台调试v1.5.1插件,视频播放失败
要先安装VideoWebPlugin.exe,再运行webs.exe,再重新使用插件试一下
5、调研web3.2回放失败问题
项目对接摄像头的话摄像头需要支持插卡功能,如果不支持插卡功能只能使用3.0插件查看回放视频
项目对接nvr的话,nvr需要支持websocket协议,摄像头支不支持都可以,nvr需要有硬盘,并且配置了计划模板(例如全天录制),
如果都满足依然查不到,浏览器登录nvr确认是否有回放视频,如果nvr里有但是控件查不到,确认对接方式
如果是对接nvr需要登录nvr的ip和端口通过通道查看,不能通过登录摄像头的ip和端口查看
6、解决预览视频切换页面又返回来之后未加载
多个3.2插件时进入页面需要执行初始化控件、登录和开始预览,离开页面执行停止预览、退出登录和销毁控件
7、web3.2对接网络球机,云台控制报错
登录设备之后需要增加调用I_GetAnalogChannelInfo获取通道信息,然后再控制云台
8、V1.5.1插件 playMode传0和传1区分预览和回放,初始化更改播放模式必须销毁后重新初始化吗
必须反初始化 然后再重新初始化
9、Web3.2录像功能不能正常使用,点击结束录制没有反应
分辨率的原因,大于1080P无插件开发包转封装录像不支持,nvr配置修改为1080P录像停止录像就正常了
10、V1.5.1插件不能遮挡,只能在最上层
的确不能被遮挡,object标签只能在最上层显示
11、一个项目里面多个页面里用到了web3.2控件,只登陆一次nvr,多次初始化视频,初始化之后不登录只预览,是否可行
不可以,重新初始化就需要重新登陆
12、当当前页面退出的时候执行退出登录I_Logout的方法,但是在另一个页面初始化登陆成功之后进行预览的时候,会返回“已经在播放了,先停止”
需要先调用停止预览接口,再调用注销登录接口,并且停止预览之后增加调用I_DestroyWorker这个接口。
13、视频可以使用https访问吗
如果nvr设备支持websockets(网页登录设备进配置网络服务配置里面查看),那可以使用HTTPS协议
如果不支持的话,只能使用HTTP协议,暂时不支持。(目前已提供新的开发包)
14、使用iframe嵌套方式加载视频,v1.5.1平台插件加载不到容器内
通过oWebControl.JS_Resize更新一下位置
15、demo只能通过nvr的ip+端口登录吗,通过域名登陆失败
多浏览器测试,在ie下可以正常查看
16、登陆项目后确认项目中是否依次返回以下信息
如果没有返回如上图,查看海康视频可能遇到的问题以及排查和解决方法:
①、确认库里配置的nvr信息和视频信息在浏览器查看nvr是否正常
②、如果报错如下图的错,说明更新的时候将打包后的js文件夹(海康文件的文件夹)覆盖在了服务器上,js文件夹不能覆盖,需要先删除服务器上的js文件夹,再将文件覆盖上去,如果海康视频没有修改的话不要动js文件夹替换别的文件就可以了
③、如果不报(②)的错也确认了(①)没问题但仍然返回登陆失败
确认使用的是支持http的插件还是支持https的插件,两个互斥,如果使用的https的插件则必须访问https的页面,反之亦然。
④、如果(3、)确认修改了还是不显示,ip地址不能为localhost或者127.0.0.1,改为本机ip。