vue实现海康H5视频插件播放视频的实例,实现取流失败了之后重新获取新的流播放视频

vue实现海康H5视频插件播放视频的实例,实现取流失败了之后重新获取新的流播放视频

h5player是一个基于HTML5的流式网络视频播放器,无需安装浏览器插件即可通过websocket协议向媒体服务取流播放多种格式的音视频流。

首先去海康开发平台,把插件包给下载下来。但是这个包需要登录下才可以获取到

地址:https://open.hikvision.com/download/5c67f1e2f05948198c909700?type=20

不想登录可以去这里拿:https://download.csdn.net/download/lu6545311/88562387

在这里插入图片描述

一、引入插件包

因为目前项目用的是vue2.5,所以我的资源包是放在了static目录下面

在这里插入图片描述

然后在index.html里面再引入

<script src="/static/js/h5player/h5player.min.js"></scrip>

二、使用

(1)因为我们项目有多个地方使用这个播放器,所以是做成了组件的形式,然后进行引入使用
//子组件
<template><div id="H5Play"></div>
</template>//父组件引入
<HKH5Player ref="hkH5Player" @resetVideoMax="resetVideoH5" @getWndPk="getWndPk"></HKH5Player>
(2)初始化
let that = this
//设置播放容器的宽高并监听窗口大小变化
window.addEventListener('resize', () => {this.player.JS_Resize()
})this.player = new window.JSPlugin({szId: 'H5Play',szBasePath: "../../static/js/h5player",//在集成过程中new JSPlugin时候必填szBasePath: './dist', // 必填,引用H5player.min.js的js相对路径,否则会引起内部加载解码库异常iMaxSplit: this.maxSplit, //分屏播放,默认最大分屏4*4iCurrentSplit: 1,openDebug: true,oStyle: {borderSelect: '#FFCC00', //选中窗口的边框颜色},// 当容器div#play_window有固定宽高时,可不传iWidth和iHeight,窗口大小将自适应容器宽高// iWidth: 600,// iHeight: 400,
})
(3)事件回调绑定(实现取流失败了之后重新获取新的流播放视频)
this.player.JS_SetWindowControlCallback({windowEventSelect: function (iWndIndex) {  //插件选中窗口回调console.log('windowSelect callback: ', iWndIndex);//每一次窗口变化都会触发这个,用来记录窗口,方便后面进行取流失败了针对对应的窗口视频进行再次播放------------that.$emit('getWndPk',iWndIndex)  //调用父组件的方法,并且把当前的窗口传过去,为了记录当前视频的pk},pluginErrorHandler: function (iWndIndex, iErrorCode, oError) {  //插件错误回调console.log('pluginError callback: ', iWndIndex, iErrorCode, oError);//视频爆发错误之后,进行想要的逻辑操作,这里是为了再次取流播放视频------------that.showErrror(iErrorCode,iWndIndex)  //iErrorCode 错误码  iWndIndex 错误的视频窗口,对应上面获取到的是窗口来进行操作},windowEventOver: function (iWndIndex) {  //鼠标移过回调//console.log(iWndIndex);},windowEventOut: function (iWndIndex) {  //鼠标移出回调//console.log(iWndIndex);},windowEventUp: function (iWndIndex) {  //鼠标mouseup事件回调//console.log(iWndIndex);},windowFullCcreenChange: function (bFull) {  //全屏切换回调console.log('fullScreen callback: ', bFull);},firstFrameDisplay: function (iWndIndex, iWidth, iHeight) {  //首帧显示回调console.log('firstFrame loaded callback: ', iWndIndex, iWidth, iHeight);},performanceLack: function () {  //性能不足回调// console.log('performanceLack callback: ');}
});
(4) 开始播放视频
//playURL:播放地址  ws://1111111
// mode 0 普通模式  1 高级模式  这里用的是高级模式
//index : 窗口
this.player.JS_Play(playURL, { playURL, mode }, index).then(() => { console.log('realplay success') },e => { console.error(e) }
)
//自动跳转下一个窗口
index = index + 1;
if (index == this.maxSplit) { index = 0 }
player.JS_SelectWnd(index);
(5)停止播放视频、销毁视频
this.player.JS_StopRealPlayAll(); //全部
this.player.JS_Stop(); //单个
(6)切换窗口数
//splitNum  最大 4 
this.player.JS_ArrangeWindow(splitNum).then(() => { console.log(`arrangeWindow to ${splitNum}x${splitNum} success`) },e => { console.error(e) }
)
(7)获取错误码,然后进行提醒

在上面的第三点中,事件的回调,我们可以获取到视频播放错误的错误码,然后官网下载的开发文档里面有对应的错误码,但是好像是不完整的,但是够用。

showErrror(val,iWndIndex){let list = {'0x12f900005':'高级模式不支持该功能','0x12f900006':'高级模式的解码库加载失败','0x12f900008':'url格式错误','0x12f900009':'取流超时错误','0x12f900010':'设置或者是获取音量失败,因为没有开启音频的窗口','0x12f900011':'设置的音量不在1-100范围','0x12f910000':'websocket连接失败,请检查网络是否通畅,URL是否正确','0x12f910010':'取流失败','0x12f910011':'流中断,电脑配置过低,程序卡主线程都可能导致流中断','0x12f910014':'没有音频数据','0x12f910015':'未找到对应websocket,取流套接字被动关闭的报错','0x12f910016':'websocket不在连接状态','0x12f910017':'不支持智能信息展示','0x12f910018':'websocket长时间未收到message','0x12f910019':'WSS连接失败,原因:端口尚未开通、证书未安装、证书不安全','0x12f910020':'单帧回放时不能暂停','0x12f910021':'已是最大倍速','0x12f910022':'已是最小倍速','0x12f910023':'ws/wss连接超时,默认6s超时时间,原因:网络异常,网络不通','0x12f910026':'jsdecoder1.0解码报错视频编码格式不支持','0x12f910027':'后端取流超时,主动关闭连接(设备突然离线或重启,网络传输超时20s)','0x12f910028':'设置的缓冲区大小无效,大小0-510241024,不在该范围的报错','0x12f910029':'普通模式的报错,码流异常导致黑屏,尝试重新取流','0x12f910031':'普通模式下播放卡主会出现','0x12f910032':'码流编码格式普通模式下不支持,可切换高级模式尝试播放','0x12f920015':'未调用停止录像,再次调用开始录像','0x12f920016':'未开启录像调用停止录像接口错误','0x12f920017':'紧急录像目标格式不支持,非ps/mp4','0x12f920018':'紧急录像文件名为null','0x12f930010':'内存不足','0x12f930011':'首帧显示之前无法抓图,请稍后重试','0x12f950000':'采集音频失败,可能是在非https域下使用对讲导致','0x12f950001':'对讲不支持这种音频编码格式','0x12f900001':'接口调用参数错误','0x12f900002':'不在播放状态','0x12f900003':'仅回放支持该功能','0x12f900004':'普通模式不支持该功能'}if (list[val]) {this.$message.error(list[val])console.error(list[val]);}//防止一直在请求,我们只给你两个错误进行再次取流,各自根据业务进行调整if (['0x12f910011','0x12f910027'].includes(val)) {this.$emit('resetVideoMax',iWndIndex);  //调用父组件的方法,并且把发生错误的窗口闯过去this.player.JS_SelectWnd(iWndIndex); // 把当前窗口选择到发生错误的窗口}
},

三、父组件的写法

主要是写了怎么视频取流失败后,再次请求获取到流进行视频播放的操作

(1)在父组件调用插件初始化方法
mounted() {setTimeout(function (){that.$refs.hkH5Player.初始化方法();that.$refs.hkH5Player.初始化方法();that.$refs.hkH5Player.初始窗口数量(1);},200)
}
(2)记录视频窗口的getWndPk方法
getWndPk(index){// h5窗口变化的时候进行// 播放视频的时候记录窗口对应的pk//这里是把对应窗口的pk记录起来,计算你手动切换的窗口也可以记录到的this.h5WndIndex = index;
},//记录到当前的窗口,然后在播放视频的时候把pk存起来
playVideo(pk){this.$axios.post('',{pk:pk,protocol:'ws'}).then(res => {this.h5PkList[this.h5WndIndex] = pk; //记录对应窗口的视频pk,为后面视频失败再次取流做准备//调用子组件的播放视频的方法,具体逻辑自行处理.....this.$refs.hkH5Player.播放视频(url);})
}
(3)取流失败后,调用方法再次取流
resetVideoH5(index){// 取流失败重新获取流let pk = this.h5PkList[index]this.playVideo(pk)
},
(4)初始播放多个视频
getList(){list = [...pk]//先判断有多少个视频,然后来展示多少个窗口,最多16个 即num最大是4if (that.videoList.length > 4 && that.videoList.length <= 9) {num = 3;} else if (that.videoList.length > 9) {num = 4;} else {num = 2;}that.$refs.hkH5Player.初始窗口数量(num);//拿到多个视频pk后,循环调用播放方法for (let index = 0; index < list.length; index++) {this.playVideo(list[index].pk)}
}

这样就可以实现视频播放失败之后再次取流进行播放

tip:重点

(1)窗口变化的记录,触发父组件播放视频的时候,接口窗口数把pk(或者你再次取流的参数等等)存起来,方便后面再次取流
(2)发生错误之后,触发父组件找到对应窗口的错误视频的pk,然后再次请求

效果

在这里插入图片描述

功能(一些具体的功能没有使用到,如果想要使用,可以去看看下载包里面的开发文档)

这样就可以实现视频播放失败之后再次取流进行播放

功能(一些具体的功能没有使用到,如果想要使用,可以去看看下载包里面的开发文档)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/178686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CopyOnWriteArrayList源码解析

CopyOnWriteArrayList源码解析 文章目录 CopyOnWriteArrayList源码解析一、CopyOnWriteArrayList二、总结 一、CopyOnWriteArrayList 在 JUC 中&#xff0c;对于 ArrayList 的线程安全用法&#xff0c;比较推崇于使用 CopyOnWriteArrayList &#xff0c;那么CopyOnWriteArrayL…

【.NET Core】委托(Delegate)应用详解

【.NET Core】委托&#xff08;Delegate&#xff09;应用详解 文章目录 【.NET Core】委托&#xff08;Delegate&#xff09;应用详解一、概述二、委托&#xff08;Delegate&#xff09;定义三、基础委托(Delegate) - 无返回值委托四、基础委托(Delegate) - 有返回值委托五、Mu…

Vue2或者uniapp 中 使用 iframe 嵌入本地 HTML 页面 并 相互通信。

1.使用 iframe 嵌入本地 HTML 页面&#xff08;以pdfjs为例&#xff09; 在 public 文件夹下新建 static 文件夹&#xff0c;然后将 html 文件及相关引用拷贝到 static 文件夹下 uniapp在src下新建hybrid文件 vue 文件完整代码 <template><div class"wrap&q…

java实现简单连点器1

这段代码是使用Java的AWT库来实现模拟鼠标点击的操作。它创建了一个Robot对象&#xff0c;通过该对象可以模拟鼠标和键盘操作。在这段代码中&#xff0c;首先设置了点击位置的坐标&#xff08;x和y&#xff09;&#xff0c;点击间隔时间&#xff08;interval&#xff09;以及点…

顶级数据恢复工具—— 最全的15个数据恢复软件榜单

在这个信息为王的数字时代&#xff0c;关键数据的丢失对个人和企业来说都可能是灾难性的。无论是由于意外删除、硬件故障还是恶意攻击&#xff0c;拥有强大的数据恢复解决方案都是至关重要的。在本综合指南中&#xff0c;我们将探索市场上最好的数据恢复软件&#xff0c;包括顶…

java+python农村集体产权管理系统php+vue

注册、登陆该系统根据操作权限的不同分为管理员和用户两种&#xff0c;新用户在登陆前要进行用户注册&#xff0c;注册完成后方可进行登陆。 本次设计的关键问题处理&#xff0c;主要有如下几点&#xff1a; (1&#xff09;本次开发&#xff0c;采用主流Thinkphp框架进行开发&a…

KernelSHAP vs TreeSHAP

Kernel SHAP和Tree SHAP都用于近似Shapley值。Tree SHAP要快得多。缺点是它只能用于基于树的算法&#xff0c;如随机森林和xgboost。另一方面&#xff0c;Kernel SHAP是模型不可知的(model agnostic)&#xff0c;这意味着它可以与任何机器学习算法一起使用。我们将比较这两种近…

如何把 Oracle 19C RAC+DG加入到ORACLE EM 13C监控

平时见ORACLE 19c rac single dg的部署很多了&#xff0c;ORACLE em 13c 的安装也很多了,但如何把手工部署的oracle 19c rac dg 添加到em 13c 中去&#xff0c;让EM13C 来实现对RACDG的监控&#xff0c;主要是DG的EM13C的监控&#xff0c;还没有看到&#xff0c;大部分都是直接…

AI编译优化技术“loop tiling“、“ordering“、“caching“和“unrolling“

文章目录 概念例子 概念 在计算机科学和编程中&#xff0c;特别是在高性能计算和优化编译器设计领域&#xff0c;“loop tiling”、“ordering”、"caching"和"unrolling"是一些常见的术语&#xff0c;它们涉及到改进程序性能的不同策略。下面分别解释这些…

2023极客大挑战-AGRT战队wp

目录 RE Shiftjmp 点击就送的逆向题 幸运数字 ​编辑 砍树 小黄鸭 flower-or-tea mySelf 是男人就来扎针 听说cpp很难&#xff1f; Easymath 寻找初音未来 Rainbow 浪漫至死不渝 ezandroid Pwn nc_pwntools password ret2text write1 ret2libc ezpwn wr…

力扣23. 合并 K 个升序链表(java,最小堆解法)

Problem: 23. 合并 K 个升序链表 文章目录 题目描述思路解题方法复杂度Code 题目描述 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 思路 1.对于合并k个有序链表&#xff0c;我们较为容易想…

高翔:《自动驾驶与机器人中的SLAM技术 》-Slam_in_autonomous_driving 编译过程中遇到的问题

使用的环境是ubuntu20.04 问题1.安装g2o没有问题&#xff0c;不过在编译整个项目工程时候报错&#xff1a; ”openmp_mutex.h: 30:10: fatal error: g2o/config.h: No such file or directory“: 解决办法&#xff1a; 只需要将/thirdparty/g2o/build/g2o下的config.h放到/…

shiro整合redis

shiro整合redis 前言&#xff1a;shiro默认的session是存储在jvm内存中的&#xff0c;这样会导致java服务内存占用更大以及一旦服务器宕机或者版本迭代需要重启服务时&#xff0c;缓存中的数据不能恢复&#xff0c;导致用户需要重新登录认证&#xff0c;体验很差。因此利用第三…

C++ STL : std::list,源码面前,了无秘密,大裤衩啥颜色材质给你写的明明白白,哈哈

eat std::list source code list的好处是每次插入或删除一个元素&#xff0c;就配置或释放一个元素空间。因此&#xff0c;list对于空间的运用有绝对的精准&#xff0c;一点也不浪费。而且&#xff0c;对于任何位置的插入和元素移除都永远是常数时间。 可惜了当下有点忙能力欠…

c语言练习12周(15~16)

编写int fun(char s[])函数&#xff0c;返回字串中所有数字累加和 题干编写int fun(char s[])函数&#xff0c;返回字串中所有数字累加和。 若传入串"k2h3yy4x"返回整数9&#xff1b;若传入串"uud9a6f7*"返回整数22 //只填写要求的函数 int fun(cha…

JSON详细教程

&#x1f60a;JSON详细教程 &#x1f6a9;JSON简介☃️JSON语法规则&#x1f50a;JSON和JavaScript对象的区别 ☃️JSON数据类型字符串&#x1f50a;数字&#x1f50a;布尔值&#x1f50a;数组&#x1f50a;对象&#x1f50a;Null ☃️JSON对象&#x1f50a;访问JSON对象的值&a…

堆的应用(堆排序、Top-K问题)

文章目录 1 堆排序2 Top-K问题 1 堆排序 堆排序是一种基于二叉堆&#xff08;通常使用数组实现&#xff09;的排序算法。 它的基本思想是利用堆这种数据结构的性质&#xff0c;通过建立一个堆&#xff08;大堆或小堆&#xff09;&#xff0c;使得堆的根节点是所有节点中的最大值…

在线 SQL 模拟器SQL Fiddle使用简介

在线 SQL 模拟器SQL Fiddle使用简介 有时候&#xff0c;我们想去验证 SQL语句&#xff0c;却缺少数据库环境&#xff0c;那该怎么办呢&#xff1f; 这时候在线 SQL 模拟器就有了用武之地。SQL 模拟器免安装&#xff0c;可以在网页直接运行 SQL 。 SQL Fiddle 支持 MySQL、Orac…

C++ Qt QString用法详解与代码演示

作者:令狐掌门 技术交流QQ群:675120140 csdn博客:https://mingshiqiang.blog.csdn.net/ 文章目录 创建和初始化长度和容量修改字符串字符串比较查找和提取数值转换arg格式化`arg` 的基本用法精确控制占位符多占位符的复杂替换使用大括号占位符注意事项迭代Unicode 和编码QSt…

SystemVerilog 入门

文章目录 包定义SystemVerilog 数据类型结构体 SystemVerilog 过程块可嵌套模块接口 System Verilog 的优点 提高了硬件建模能力、编码效率和抽象能力&#xff1b;RTL 级、系统级行为描述&#xff1b; 增强了验证能力和为大规模复杂设计编写有效、无竞争测试程序的断言功能&am…