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.rhkb.cn/news/202031.html

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

相关文章

设计模式篇---外观模式

文章目录 概念结构实例总结 概念 外观模式&#xff1a;为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。 外观模式引入了一个新的外观类&#xff0c;它为多个业务类的调用提供了一个统一的入口。主要优点…

Jenkins扩展篇-流水线脚本语法

JenkinsFile可以通过两种语法来声明流水线结构&#xff0c;一种是声明式语法&#xff0c;另一种是脚本式语法。 脚本式语法以Groovy语言为基础&#xff0c;语法结构同Groovy相同。 由于Groovy学习不适合所有初学者&#xff0c;所以Jenkins团队为编写Jenkins流水线提供一种更简…

你的关联申请已发起,请等待企业微信的管理员确认你的申请

微信支付对接时&#xff0c;需要申请AppID,具体在下面的位置&#xff1a; 关联AppID&#xff0c;发起申请时&#xff0c;会提示这么一句话&#xff1a; 此时需要登录企业微信网页版&#xff0c;使用注册人的企业微信扫码登录进去&#xff0c;然后按照下面的步骤操作即可。 点击…

硬核神作|2w字带你拿下Sentinal

目录 Sentinel概述 基本介绍 Sentinel 基本核心概念 Sentinel安装 简单安装启动 启动配置项 SpringCloud简单整合 实战架构 父工程pom文件 teacher-service服务 student-service服务 测试 整合Sentinel SpringCloud微服务保护方案解读 服务雪崩定义 问题的产生 …

计算机网络之物理层(数据通信有关)

一、概述 1.1物理层引入的目的 屏蔽掉传输介质的多样性&#xff0c;导致数据传输方式的不同&#xff1b;物理层的引入使得高层看到的数据都是统一的0,1构成的比特流 1.2.物理层如何实现屏蔽 物理层靠定义的不同的通信协议&#xff08;一般称通信规程&#xff09; 这些协议…

内裤洗衣机有用吗?口碑最好的小型洗衣机

想必各位小伙伴都知道我们的贴身衣物&#xff0c;不可以与其他衣服一起在洗衣机中清洗&#xff0c;每次都需要把内衣裤挑选出来手洗&#xff0c;但是我们每天都要上厕所&#xff0c;难免会沾上污渍和细菌&#xff0c;我们在用手搓洗的过程中很难把细菌给清除掉&#xff0c;所以…

砖家测评:腾讯云标准型S5服务器和s6性能差异和租用价格

腾讯云服务器CVM标准型S5和S6有什么区别&#xff1f;都是标准型云服务器&#xff0c;标准型S5是次新一代云服务器规格&#xff0c;标准型S6是最新一代的云服务器&#xff0c;S6实例的CPU处理器主频性能要高于S5实例&#xff0c;同CPU内存配置下的标准型S6实例要比S5实例性能更好…

Windows平台Unity下实现camera场景推送RTMP|轻量级RTSP服务|实时录像

技术背景 我们在对接Unity平台camera场景采集的时候&#xff0c;除了常规的RTMP推送、录像外&#xff0c;还有一些开发者&#xff0c;需要能实现轻量级RTSP服务&#xff0c;对外提供个拉流的RTSP URL。 目前我们在Windows平台Unity下数据源可采集到以下部分&#xff1a; 采集…

Altium Designer 相同模块的布局布线复用-AD

1、利用交互式布线&#xff0c;将两个相同模块的元器件在PCB上分块显示。 在原理图中&#xff0c;框选某一模块电路、按快捷键 TS 切换到PCB编辑界面、工具>器件摆放>在矩形区域内排列&#xff08;可将模块中的器件都集中放置到矩形框内&#xff09;。2、为模块电路添加 …

【2021集创赛】基于ARM-M3的双目立体视觉避障系统 SOC设计

本作品参与极术社区组织的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~活动。 团队介绍 参赛单位&#xff1a;上海电力大学 队伍名称&#xff1a;骇行队 总决赛奖项&#xff1a;二等奖 1.摘要 随着信息技术的发展&#xff0c;AGV&#xff08;Automated Guided Vehic…

Modbus转Profinet网关:PLC与天信流量计通讯的经典案例

无论您是PLC或工业设备的制造商&#xff0c;还是工业自动化系统的维护人员&#xff0c;可能会遇到需要将不同协议的设备连接组合并通讯的情况&#xff0c;Modbus和Profinet是现代工业自动化中常见的两种通信协议&#xff0c;在工业控制领域中被广泛应用。 在这种情况绝大多数会…

CentOS 7 使用cJSON 库

什么是JSON JSON是一种轻量级的数据交换格式&#xff0c;可读性强、编写简单。键值对组合编写规则&#xff0c;键名使用双引号包裹&#xff0c;冒号&#xff1a;分隔符后面紧跟着数值&#xff0c;有两种常用的数据类型是对象和数组。 对象&#xff1a;使用花括号{}包裹起来的…

DeepWalk: Online Learning of Social Representations(2014 ACM SIGKDD)

DeepWalk: Online Learning of Social Representations----《DeepWalk&#xff1a;用于图节点嵌入的在线机器学习算法》 DeepWalk 是将 word2vector 用到 GNN 上 DeepWalk&#xff1a; 将 Graph 的每个节点编码为一个 D 维向量&#xff08;无监督学习&#xff09;&#xff0c;E…

加班做报表被嘲低效!快用大数据分析工具

做数据分析报表很耗时间&#xff0c;因为不仅要解决多业务系统数据质量标准不一问题&#xff0c;还需要进行大量的公式计算、报表设计与制作。但那是以前&#xff0c;在大数据分析工具强势崛起的当下&#xff0c;这些工作都能交给大数据分析工具来做了。以前是花90%的时间做报表…

哈希表-set、map

当需要判断一个元素是否在集合中时&#xff0c;就使用哈希法 散列表&#xff08;Hash table&#xff0c;也叫哈希表&#xff09;&#xff0c;是根据键&#xff08;Key&#xff09;而直接访问在内存存储位置的数据结构。 哈希表中关键码就是数组的索引下标&#xff0c;然后通过…

【giszz笔记】产品设计标准流程【8】

&#xff08;续上回&#xff09; 真的没想到写了8个章节&#xff0c;想参考之前文章的&#xff0c;我把链接给到这里。 【giszz笔记】产品设计标准流程【7】-CSDN博客 【giszz笔记】产品设计标准流程【6】-CSDN博客 【giszz笔记】产品设计标准流程【5】-CSDN博客 【giszz笔…

苹果手机内存满了怎么清理?这里有你想要的答案!

手机内存不足是一个比较普遍的现象。由于现在手机应用程序的功能越来越强大&#xff0c;所以占用的内存也越来越大。同时用户会在手机中存储大量的数据&#xff0c;如照片、视频、文档等&#xff0c;这些都会占用大量的手机空间。那么&#xff0c;苹果手机内存满了怎么清理&…

Xilinx Zynq-7000系列FPGA任意尺寸图像缩放,提供两套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐FPGA图像处理方案FPGA图像缩放方案 3、设计思路详解HLS 图像缩放介绍 4、工程代码1&#xff1a;图像缩放 HDMI 输出PL 端 FPGA 逻辑设计PS 端 SDK 软件设计 5、工程代码2&#xff1a;图像缩放 LCD 输出PL 端 FPGA 逻辑设计PS 端 SDK 软件设…

基于JAVA+SpringBoot+VUE+微信小程序的前后端分离咖啡小程序

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会的快速发展和…

分布式篇---第一篇

系列文章目录 文章目录 系列文章目录前言一、分布式幂等性如何设计?二、简单一次完整的 HTTP 请求所经历的步骤?三、说说你对分布式事务的了解前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,…