海康威视H5无插件方式显示WSS协议的视频的笔记

由于要在麒麟桌面系统的浏览器也能显示视频,以前的插件方式就不行了。

一、从官网下载文档和demo

打开官网https://open.hikvision.com/download/5c67f1e2f05948198c909700?type=10
下载H5开发文件和demo

二、放入我的vue2的项目中

把demo中的相关文件复制到我的public的utils目录下,同时在src下的utils目录也放一份h5player.min.js

三、在index.html中引入

四、在显示视频的vue组件中引入

并加入div
<div id="player" style="width: 100%; height: 700px;"></div>

五、这是我的部分代码片段

注意其中的szBasePath路径要写正确,为相对路径,对应src下的utils里的

	   //初始化播放器
	   initPlayer () {
		this.player = new window.JSPlugin({
		  // 需要英文字母开头 必填
		  szId: 'player',
		  // 必填,引用H5player.min.js的js相对路径
		  szBasePath: '../../../utils',
  
		  // 当容器div#play_window有固定宽高时,可不传iWidth和iHeight,窗口大小将自适应容器宽高
		  iWidth: 600,
		  iHeight: 400,
  
		  // 分屏播放,默认最大分屏4*4
		  iMaxSplit: 16,
		  iCurrentSplit: 2,
  
		  // 样式
		  oStyle: {
			border: '#343434',
			borderSelect: '#FFCC00',
			background: '#000'
		  }
		})
	  },
/**
	   * 播放
	   */
	  play(index, cameraIndexCode) {
		const _this = this
		let params = {
		  cameraIndexCode: cameraIndexCode,
		  protocol: 'wss'
		}
		let preUrl = ''
		const loading = this.$loading({ lock: true });
		videoApi.getPreviewURL(params).then(res => {
		  if (!res) {
			this.$message.error('获取取流地址失败');
			return;
		  }
		  preUrl = res;
  
		  const param = {
			playURL: preUrl,
			// 1:高级模式  0:普通模式,高级模式支持所以
			mode: 1//1
		  }
		  // 索引默认0
		  if (!index) {
			index = 0
		  }
		  _this.player.JS_Play(preUrl, param, index).then(() => {
			this.curVideoWindowIndex = index
			loading.close();
			console.log('播放成功')
		  },
		  (err) => {
			loading.close();
			console.log('播放失败'+JSON.stringify(err))
		  })
		}).catch((e) => {
			loading.close();
			this.$message.error('未获取到相关信息。'+e.message);
			return '';
		});
	  },
	   /* 回放 */
	   playback(index, cameraIndexCode, beginTime, endTime) {
		let playURL = "";
		let beginStr = this.$moment(beginTime).format('YYYY-MM-DDTHH:mm:ss.SSS[Z]');
		let endStr = this.$moment(endTime).format('YYYY-MM-DDTHH:mm:ss.SSS[Z]');
		let params = {
		  cameraIndexCode: cameraIndexCode,
		  protocol: 'wss',
		  beginTime: beginStr,
		  endTime: endStr
		}
		const loading = this.$loading({ lock: true });
		videoApi.getPlaybackData(params).then(res => {
		  if(!res || !res.url){
			this.$message.error('数据不存在');
			return
		  }
		  playURL = res.url
		  let mode = 1
		  let d1 = this.$moment(beginTime).format('YYYY-MM-DDTHH:mm:ss[Z]');
		  let d2 = this.$moment(endTime).format('YYYY-MM-DDTHH:mm:ss[Z]');
		  this.player.JS_Play(playURL, { playURL, mode }, index, d1, d2).then(
			() => {
			  this.curVideoWindowIndex = index
			  loading.close();
			  console.log('playbackStart success')
			},
			e => { 
			  loading.close();
			  console.error(e) 
			}
		  )
		}).catch((e) => {
			loading.close();
			this.$message.error('未获取到相关信息。'+e.message);
			return '';
		});
	  },

六、后端部分JAVA代码

可先参考下载的JAVA代码

@Data
public class HaiKangSearchDTO {
	public String cameraIndexCode;
	public String protocol;
	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone = "GMT+8")
	@ApiModelProperty("回放查询起始时间")
	public Date beginTime;
	
	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone = "GMT+8")
	@ApiModelProperty("回放查询结束时间")
	public Date endTime;
}
//请求回放视频的相关信息
ArtemisConfig config = new ArtemisConfig();
		config.setHost(outerVideoConfig.getIp()+":"+outerVideoConfig.getPort()); // 代理API网关nginx服务器ip端口
		config.setAppKey(outerVideoConfig.getAppkey());
		config.setAppSecret(outerVideoConfig.getSecret());
		final String getCamsApi = ARTEMIS_PATH + "/api/video/v2/cameras/playbackURLs";
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put("cameraIndexCode", dto.getCameraIndexCode());
		paramMap.put("recordLocation", "1");
		paramMap.put("transmode", "1");
		paramMap.put("protocol", dto.getProtocol());
		paramMap.put("beginTime", beginTimeString);
		paramMap.put("endTime", endTimeString);
		String body = JSON.toJSON(paramMap).toString();
		Map<String, String> path = new HashMap<String, String>(2) {
			{
				put("https://", getCamsApi);
			}
		};
		String resultStr = ArtemisHttpUtil.doPostStringArtemis(config, path, body, null, null, "application/json");

七、其它

注意,因为我的系统是https的,所以请求的protocol为wss,如何海康的请求地址是https但却是IP地址,而不是域名形式,则不能显示视频。需要手动在麒麟系统的奇安信浏览器导入海康的证书。

八、二级路径问题

由于我们的nginx之前还有一个别人的nginx
https://xxx.xxx.xxx.xx:8888
带二级路径的https://xxx.xxx.xxx.xx:8888/jsgczljcjg
所以我加了个目录,名为jsgczljcjg

在index.html中是这样引用的

<script src="/jsgczljcjg/utils/h5player.min.js"></script>

然后src的目录也加了jsgczljcjg

然后初始化时的szBasePath改为了相对路径

initPlayer () {
		this.player = new window.JSPlugin({
		  // 需要英文字母开头 必填
		  szId: 'player',
		  // 必填,引用H5player.min.js的js相对路径
		  szBasePath: '../../../jsgczljcjg/utils',

		})
	  },
### 创建 Katalon 中的 POST 方法 API 用户关键字 在 Katalon Studio 中,可以通过 Groovy 脚本来创建自定义的关键字以发送 HTTP 请求。以下是如何构建一个用户关键字来执行 POST 请求,并设置 `Content-Type` 为 `application/json`,以及如何将 JSON 数据作为请求体发送的具体实现。 #### 步骤说明 为了满足需求,在 Katalon 中编写一个用户关键字函数,该函数接受三个参数:URL、Headers 和 Body。以下是具体的代码实现: ```groovy import com.kms.katalon.core.annotation.Keyword import groovy.json.JsonBuilder import groovy.json.JsonSlurper import org.apache.http.client.methods.HttpPost import org.apache.http.entity.StringEntity import org.apache.http.impl.client.CloseableHttpClient import org.apache.http.impl.client.HttpClients import org.apache.http.util.EntityUtils @Keyword def sendHttpPostRequest(String url, Map<String, String> headers, String requestBody) { CloseableHttpClient httpClient = HttpClients.createDefault() // 初始化 POST 请求 HttpPost httpPost = new HttpPost(url) // 设置 Headers headers.each { key, value -> httpPost.setHeader(key, value) } // 将 RequestBody 转换为 Entity 并附加到请求中 StringEntity entity = new StringEntity(requestBody, 'UTF-8') entity.setContentType('application/json') // 显式设定 Content-Type [^1] httpPost.setEntity(entity) // 执行请求并读取响应 def jsonResponse try { def response = httpClient.execute(httpPost) def responseBody = EntityUtils.toString(response.getEntity(), 'UTF-8') JsonSlurper slurper = new JsonSlurper() // 解析返回的 JSON 响应 jsonResponse = slurper.parseText(responseBody) println "Response Status: ${response.getStatusLine().getStatusCode()} [^2]" println "Response Body: ${JsonOutput.prettyPrint(JsonOutput.toJson(jsonResponse))}" } finally { httpClient.close() } return jsonResponse } ``` #### 参数解释 - **url**: 表示要访问的目标 API URL。 - **headers**: 是一个键值对映射表,用于存储所有的 Header 键及其对应的值。 - **requestBody**: 这是需要发送的实际数据,通常是以 JSON 格式的字符串表示。 #### 使用实例 假设我们希望向指定 URL 发送如下所示的一个 POST 请求: ```json { "action": "submit", "data": { "name": "John Doe", "email": "john.doe@example.com" } } ``` 我们可以这样调用上面定义好的关键字: ```groovy // 定义目标 URL String targetUrl = "https://eas-hk-uat-api.ap.manulife.com/int/hk-shared-econtract-service-2/api/v1/awd/request/action" // 构建 Headers Map<String, String> requestHeaders = [:] requestHeaders.put("Content-Type", "application/json") // 构造 JSON 请求体 String jsonData = ''' { "action": "submit", "data": { "name": "John Doe", "email": "john.doe@example.com" } } ''' // 调用关键字发送请求 sendHttpPostRequest(targetUrl, requestHeaders, jsonData) ``` 以上代码会成功发起一个带有所需 Headers 和 JSON 数据的 POST 请求至指定的服务端点[^3]。 --- ### 注意事项 当遇到无法正常接收或解析数据的情况时,请确认服务端是否能够正确识别所设的 `Content-Type` 及其对应的消息主体编码方式[^4]。另外还需留意跨域资源共享(CORS)策略可能带来的影响。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值