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

news2024/11/17 23:55:18

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*4
    iCurrentSplit: 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最大是4
    if (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.coloradmin.cn/o/1245967.html

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

相关文章

基于springboot实现家乡特色推荐系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现家乡特色推荐系统演示 摘要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括家乡特色推荐的网络应用&#xff0c;在外国家乡特色推荐系统已经是很普遍的方式&#xff0c;不过国内的管理网站可能还处于起步…

(保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示

讲解 MySQL 中索引、触发器、存储过程、存储函数的使用 文章目录 1. 索引1.1 索引的分类1.2 索引的设计原则1.3 如何使用&#xff08;create index&#xff09; 2. 触发器2.1 触发器的分类2.2 如何使用&#xff08;create trigger&#xff09; 3. 存储过程3.1 如何使用&#xf…

2023.11.23使用flask实现在指定路径生成文件夹操作

2023.11.23使用flask实现在指定路径生成文件夹操作 程序比较简单&#xff0c;实现功能&#xff1a; 1、前端输入文件夹 2、后端在指定路径生成文件夹 3、前端反馈文件夹生成状态 main.py from flask import Flask, request, render_template import osapp Flask(__name__)a…

c语言十进制转二进制

以下是一个将十进制数转换为二进制数的C语言代码示例&#xff1a; #include <stdio.h>void decimal_to_binary(int decimal) { int binary[32]; int i 0; while (decimal > 0) { binary[i] decimal % 2; decimal / 2; i; } pr…

使用Pytorch从零开始构建GRU

门控循环单元 (GRU) 是 LSTM 的更新版本。让我们揭开这个网络的面纱并探索这两个兄弟姐妹之间的差异。 您听说过 GRU 吗&#xff1f;门控循环单元&#xff08;GRU&#xff09;是更流行的长短期记忆&#xff08;LSTM&#xff09;网络的弟弟&#xff0c;也是循环神经网络&#x…

HCIP-七、IS-IS 综合实验

七、IS-IS 综合实验 实验拓扑实验需求及解法1.如图所示&#xff0c;配置所有路由器的接口IP地址。2.运行IS-IS&#xff0c;进程号13.IS-IS优化4.路径优化 实验拓扑 实验需求及解法 本实验模拟IS-IS综合网络&#xff0c;完成以下需求&#xff1a; 1.如图所示&#xff0c;配置所…

Python模块之yaml:简化配置与数据解析

更多Python学习内容&#xff1a;ipengtao.com YAML&#xff08;YAML Aint Markup Language&#xff09;是一种人类可读的数据序列化格式&#xff0c;常用于配置文件和数据传输。在Python中&#xff0c;可以使用PyYAML模块来处理YAML格式的数据。本文将深入介绍PyYAML的基础用法…

C++学习之路(二)C++如何实现一个超简单的学生信息管理系统?C++示例和小项目实例

这个示例实现了一个简单的学生信息管理系统。它包括了学生类的定义&#xff0c;可以添加学生信息、显示所有学生信息&#xff0c;将学生信息保存到文件并从文件加载信息。通过这个示例&#xff0c;你可以了解到如何使用类、函数和文件操作来构建一个基本的信息管理系统。 一个简…

基于springboot实现大学生就业服务平台系统项目【项目源码】计算机毕业设计

基于springboot实现大学生就业服务平台系统演示 Java技术 Java是由SUN公司推出&#xff0c;该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称&#xff0c;也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备了显著…

OSG编程指南<九>:坐标系统及坐标系变换

1、坐标系统 坐标系是一个精确定位对象位置的框架&#xff0c;所有的图形变换都是基于一定的坐标系进行的。对于从事计算机图形学的研究者&#xff0c;掌握图形变换是不可或缺的&#xff0c;因此&#xff0c;理解坐标系非常重要。一个三维图形工作者可以认为自己站在一定的坐标…

【初始前后端交互+原生Ajax+Fetch+axios+同源策略+解决跨域】

初始前后端交互原生AjaxFetchaxios同源策略解决跨域 1 初识前后端交互2 原生Ajax2.1 Ajax基础2.2 Ajax案例2.3 ajax请求方式 3 Fetch3.1 fetch基础3.2 fetch案例 4 axios4.1 axios基础4.2 axios使用4.2.1 axios拦截器4.2.2 axios中断器 5 同源策略6 解决跨域6.1 jsonp6.2 其他技…

【每日一题】2824. 统计和小于目标的下标对数目-2023.11.24

题目&#xff1a; 2824. 统计和小于目标的下标对数目 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 target &#xff0c;请你返回满足 0 < i < j < n 且 nums[i] nums[j] < target 的下标对 (i, j) 的数目。 示例 1&#xff1a; 输入&#xff1…

Digicert通配符证书:满足你的所有需求

通配符证书是一种可以保护一个主域名及其所有子域名的SSL证书。这意味着&#xff0c;如果你有一个主域名&#xff0c;比如www.example.com&#xff0c;并且你有多个子域名&#xff0c;比如blog.example.com、store.example.com等&#xff0c;那么只需要一个通配符证书&#xff…

ubuntu22.04系统下载程序和依赖,并拷贝到指定路径下

脚本1 apt install aptitude apt-get -d install xxx #xxx是待下载的安装包 mv /var/cache/apt/archives/* /home/tuners/1apt install aptitude apt-get -d install xxx mv /var/cache/apt/archives/*.deb /home/tuners/1 xxx 为程序包名称 /home/tuners/1为保存程序包的…

阿里云windwos 安装oracle数据库,外部用工具连接不上,只能在服务器本机通过127.0.0.1 连接

1. 首先检查阿里云服务器安全组端口是否开放 oracle 数据库端口 2. 其次找到oracle 安装的目录&#xff0c;打开这俩个文件&#xff0c;将localhost 修改为 服务器本机名称 3.重启oracle 监听服务&#xff0c;就可以连接了

IBM SPSS Statistics 27 Mac(统计分析软件)

IBM SPSS Statistics是一款数据分析和统计建模软件&#xff0c;它专为研究人员、分析师和商业用户设计。该软件能够帮助用户对大量数据进行分析和预测&#xff0c;帮助用户制定决策和解决问题。 IBM SPSS Statistics提供了丰富的统计分析功能&#xff0c;包括描述性统计、相关性…

【鸿蒙应用ArkTS开发系列】- 云开发入门实战二 实现省市地区三级联动地址选择器组件(下)

文章目录 概述端云调用流程端侧集成AGC SDK端侧省市地区联动的地址选择器组件开发创建省市数据模型创建省市地区视图UI子组件创建页面UI视图Page文件 打包测试总结 概述 我们在前面的课程&#xff0c;对云开发的入门做了介绍&#xff0c;以及使用一个省市地区联动的地址选择器…

IDM(Internet Download Manager)PC版提升下载速度与效率的利器

你是否曾经因为下载速度慢而感到烦恼&#xff1f;或者在下载大型文件时&#xff0c;经历了长时间的等待&#xff1f;如果你有这样的困扰&#xff0c;那么IDM&#xff08;Internet Download Manager&#xff09;就是你的救星&#xff01; IDM是一款高效、实用的下载管理器&…

PS 计数工具 基础使用方式讲解

上文PS 注释工具 基础使用方法讲解 中 我们讲了注释工具 解析来 我们来看这个计数工具 这里 我们换一张图像 如果 我要你数清楚 这个图上有几个咖啡豆 你能数清楚吗&#xff1f; 哈哈 其实也不难 不是特别大 但是 例如很多 且无规则物品时 我们可能就会数乱 左上角属性的话 我…

vue2【组件的构成】

目录 1&#xff1a;什么是组件化开发 2&#xff1a;vue中的组件化开发 3&#xff1a;vue组件的三个组成部分 4&#xff1a;组件中定义方法&#xff0c;监听器&#xff0c;过滤器&#xff0c;计算属性节点。 5&#xff1a;template中只允许唯一根节点&#xff0c;style默认…