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*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,然后再次请求

效果

在这里插入图片描述

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

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

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

iar如何全擦芯片内存

Project ->Download -> Erase memory

什么是零拷贝 、零拷贝优化方案 - 真正的零拷贝,哪些地方会用到零拷贝技术

文章目录 什么是零拷贝3、零拷贝优化方案 - 真正的零拷贝哪些地方会用到零拷贝技术 现在来谈谈零拷贝&#xff0c;以及在开发中哪些地方使用到零拷贝。 开干… 什么是零拷贝 零拷贝指的是&#xff0c;从一个存储区域到另一个存储区域的copy任务无需CPU参与就可完成。零拷贝的底…

基于springboot实现应急救援物资管理系统项目【项目源码】

基于springboot实现应急救援物资管理系统演示 JAVA简介 JavaScript是一种网络脚本语言&#xff0c;广泛运用于web应用开发&#xff0c;可以用来添加网页的格式动态效果&#xff0c;该语言不用进行预编译就直接运行&#xff0c;可以直接嵌入HTML语言中&#xff0c;写成js语言&a…

python游戏开发pygame初步

文章目录 安装和示例移动物体优化 安装和示例 顾名思义&#xff0c;PyGame就是用来做游戏的Python库&#xff0c;提供了许多游戏开发功能&#xff0c;如图像处理、音频播放、事件处理、碰撞检测等等。从这个角度来说&#xff0c;pygame不仅是一个游戏库&#xff0c;同时也是一…

【教3妹学编程-算法题】统计子串中的唯一字符

3妹&#xff1a;“太阳当空照&#xff0c;花儿对我笑&#xff0c;小鸟说早早早&#xff0c;你为什么背上炸药包” 2哥 :3妹&#xff0c;什么事呀这么开发。 3妹&#xff1a;2哥你看今天的天气多好啊&#xff0c;阳光明媚、万里无云、秋高气爽&#xff0c;适合秋游。 2哥&#x…

【brpc学习实践八】bvar及其应用

什么是bvar bvar是多线程环境下的计数器类库&#xff0c;支持单维度bvar和多维度mbvar&#xff0c;方便记录和查看用户程序中的各类数值&#xff0c;它利用了thread local存储减少了cache bouncing&#xff0c;相比UbMonitor(百度内的老计数器库)几乎不会给程序增加性能开销&a…

4、浏览器插件配置使用

文章目录 一、Hackbar1. Load和Execute功能的使用2. Split功能的使用3. Post功能的使用4. 编码功能的使用 二、FoxyProxy1、设置Burpsuite的代理服务端口2、FoxyProxy插件的简单使用 三、User-Agent Switcher 一、Hackbar 火狐浏览器中按下F12键启用hackbar。 1. Load和Execut…

springboot宠物店管理系统-计算机毕设 附源码 32041

SpringBoot宠物店管理系统 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;宠物行业当然也不例外。宠物店管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理…

leetcode算法之链表

目录 1.两数相加2.两两交换链表中的节点3.重排链表4.合并K个升序链表5.K个一组翻转链表 1.两数相加 两数相加 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(…

Docker Swarm总结+service创建和部署、overlay网络以及Raft算法(2/4)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

鸿蒙开发-ArkTS 语言-基础语法

1. 初识 ArkTS 语言 ArkTS 是 HarmonyOS 优选主力开发语言。ArkTS 是基于 TypeScript (TS) 扩展的一门语言&#xff0c;继承了 TS 的所有特性&#xff0c;是TS的超集。 主要是扩展了以下几个方面&#xff1a; 声明式UI描述和自定义组件&#xff1a; ArkTS使用声明式的方式描述用…

存算一体还是存算分离?谈谈数据库基础设施的架构选择

从一则用户案例说起 某金融用户问&#xff0c;数据库用服务器本地盘性能好还是外置存储好&#xff1f;直觉上&#xff0c;本地盘路径短性能应该更好。然而测试结果却出乎意料&#xff1a;同等中等并发压力&#xff0c;混合随机读写模型&#xff0c;服务器本地SSD盘合计4万 IOPS…

提示工程-Prompt Engineering

提示工程 提示工程 1、概述 Prompt Engineering&#xff1a; 提示工程 通过自然语言&#xff08;英语、汉语等&#xff09;来给AI下达指示&#xff0c;从而让AI完成你指定给他的工作的过程都可以称之为提示工程。&#xff08;面向自然语言编程&#xff09; 提示词要素 指令&…

C语言公交车之谜(ZZULIOJ1232:公交车之谜)

题目描述 听说郑州紫荆山公园有英语口语角&#xff0c;还有很多外国人呢。为了和老外对上几句&#xff0c;这周六早晨birdfly拉上同伴早早的就坐上了72路公交从学校向紫荆山进发。一路上没事干&#xff0c;birdfly开始思考一个问题。 从学校到紫荆山公园共有n(1<n<20)站路…

Day02嵌入式---按键控灯

一、简单介绍 按键控制灯开关是一种常见的嵌入式系统示例项目&#xff0c;它通常用于演示嵌入式系统的基本控制能力。该项目由一个或多个LED和一个按键组成。通过按下按键&#xff0c;可以控制LED的开关状态&#xff0c;从而实现灯的亮灭控制。 二、查看功能手册 2.1 查看硬件…

学习笔记:如何分析财务报表

其实财务报表分析最核心的东西&#xff0c;是通过财务报表这个结果&#xff0c;由果推因&#xff0c;找出造成这个结果的原因。 会计是商业的语言 首先第一个问题是——会计是商业的语言&#xff0c;这是会计的根本。 什么叫“语言”&#xff0c;就是可以通过它进行交流。比如…

队列实现栈VS栈实现队列

目录 【1】用队列实现栈 思路分析 ​ 易错总结 Queue.c&Queue.h手撕队列 声明栈MyStack 创建&初始化栈myStackCreate 压栈myStackPush 出栈&返回栈顶元素myStackPop 返回栈顶元素myStackTop 判断栈空否myStackEmpty 释放空间myStackFree MyStack总代码…

2024年天津天狮学院专升本食品质量与安全专业《分析化学》考纲

2024年天津天狮学院食品质量与安全专业高职升本入学考试《分析化学》考试大纲 一、考试性质 《分析化学》专业课程考试是天津天狮学院食品质量与安全专业高职升本入学考试 的必考科目之一&#xff0c;其性质是考核学生是否达到了升入本科继续学习的要求而进行的选拔性考试。《…

第十七章 解读PyTorch断点训练(工具)

主要有以下几方面的内容&#xff1a; 对于多步长训练需要保存lr_schedule初始化随机数种子保存每一代最好的结果 简单详细介绍 最近在尝试用CIFAR10训练分类问题的时候&#xff0c;由于数据集体量比较大&#xff0c;训练的过程中时间比较长&#xff0c;有时候想给停下来&…

python-opencv 人脸68点特征点检测

python-opencv 人脸68点特征点检测 不是很难&#xff0c;主要还是掉包&#xff0c;来看一下代码啊&#xff1a; # coding: utf-8 # 导包 import numpy as np import dlib import cv2class face_emotion(object):def __init__(self):# 人脸检测器对象&#xff0c;通过它拿到人…