C# Blazor Server 调用海康H5Player播放摄像头画面

目标

    调用海康综合安防平台api,通过摄像头的cameraIndexCode调用【获取监控点预览取流URLv2】api,得到websocket 的url,然后在blazor server中使用htplayer.js播放摄像头实时画面。

步骤

  1. 根据摄像头名字,调用【查询监控点列表v2】获取摄像头的cameraIndexCode;
  2. 调用【获取监控点预览取流URLv2】api,获得websocket 的url;
  3. 在blazor中封装组件,通过JSRuntime与htplayer.js交互;
  4. 将2步url传给htplayer.js播放,播放。

环境

  • .net8 blazor server
  • 海康运行管理中心v1.5.118
  • 海康综合管理平台
  • 海康web播放库 H5player_2.1.3
  • 海康OpenAPI安全认证库(C#) V1.0.1

其中 海康运行管理中心和综合管理平台已经存在,H5Player和C# OpenAPI库可以从海康开放平台 (hikvision.com) 下载(手机+短信登录)。

前提一:获得appKey, appSecret

  可以通过海康运行管理中心的合作方功能中获得。

前提二: 海康综合管理平台网页能够播放视像头

  遇到海康桌面客户端可以,网页不能播放的情况,海康平台需要打补丁。

第一步 调用【查询监控点列表v2】获取摄像头的cameraIndexCode

  可以在http://ip:9017/artemis-web/debughttp://ip:9017/artemis-web/api/index 【API网关】中,搜查询监控点列表v2,然后点【在线调试】,其中body 里面的name 为在海康综合管理平台中的一个能够在线播放的摄像头名称(如截图中的 一号门入口3)。调用成功会得到cameraIndexCode(27eccee91fc34d38a7d9deec11c947c9)

http://ip:9017/artemis-web/debug

第二步 调用【获取监控点预览取流URLv2】api,获得websocket 的url

  【API网关】中,搜查询 获取监控点预览取流URLv2,用上一步得到的cameraIndexCode(27eccee91fc34d38a7d9deec11c947c9),获取ws或wss流地址(ws://172.17.18.246:559/openUrl/9m6RJNS),注意该地址需要在5分钟内使用,否则失效。

第三步 在blazor server中封装组件,通过JSRuntime与htplayer.js交互

  封装组件需要一个<div>元素,并且给定id(如hkplayerdiv)。注意,要在组件AfterRender后再调用htplayer.js,否则这个div还不存在。代码中假设cameraIndexCode已知,不再调用【查询监控点列表v2】。

<div id="hkplayerdiv" style="height:800px; width:100%;"> </div>

  组件需要通过https调用【获取监控点预览取流URLv2】api,用cameraIndexCode获得预览ws或wss的url。这里需要用到 海康OpenAPI安全认证库(C#) V1.0.1 中的HttpUtillib.cs,但需要注释掉272 if(_isHttps) 括起来的代码,否则会报错

/*if (_isHttps)
{// set remote certificate Validation auto passServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(remoteCertificateValidate);// FIX:修复不同.Net版对一些SecurityProtocolType枚举支持情况不一致导致编译失败等问题,这里统一使用数值ServicePointManager.SecurityProtocol = (SecurityProtocolType)48 | (SecurityProtocolType)3072 | (SecurityProtocolType)768 | (SecurityProtocolType)192;//ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
}*/

   组件的代码部分。

public partial class HKPlayer{bool visible = false;[Parameter]public string Title { get; set; } = "实时监控画面";[Inject]public IJSRuntime JSRuntime { get; set; } = null!;[Inject]public IMessageService messageService { get; set; }[Inject]public HttpClient HttpClient { get; set; }HKCameraTemplate template = new();protected override async Task OnInitializedAsync(){HttpUtillib.SetPlatformInfo(template.AppKey, template.AppSecret, template.Ip, template.Port, template.IsHttps);}bool firstVisibleRender = true;protected override async Task OnAfterRenderAsync(bool firstRender){await base.OnAfterRenderAsync(firstRender);if (visible && firstVisibleRender){firstVisibleRender = false;}if (visible && !string.IsNullOrEmpty(_cameraIndexCode)){await playAsync(_cameraIndexCode);}}string _cameraIndexCode = string.Empty;public void Play(string cameraIndexCode){_cameraIndexCode = cameraIndexCode;visible = true;StateHasChanged();            }private async Task playAsync(string cameraIndexCode){HttpUtillib.SetPlatformInfo(template.AppKey, template.AppSecret, template.Ip, template.Port, template.IsHttps);var previewRequest = new PreviewRequest() { cameraIndexCode = cameraIndexCode };string body = JsonConvert.SerializeObject(previewRequest);byte[] result = null;try{result = HttpUtillib.HttpPost(template.PreviewUrl, body, 15);}catch (Exception ex){await messageService.Error($"获取流地址失败:{ex.Message}");}if (null == result){// 请求失败await messageService.Error("/artemis/api/video/v2/cameras/previewURLs: POST fail");}else{var json = Encoding.UTF8.GetString(result);var obj = JsonConvert.DeserializeObject<PreviewApiResponse>(json);if (obj != null && obj.Msg == "success"){await JSRuntime.InvokeVoidAsync("HKPlayer.play", obj.Data.Url);}}}private void onVisibleChange(bool b){visible = b;if (!b){_ = JSRuntime.InvokeVoidAsync("HKPlayer.stop");}}public void Dispose(){_ = JSRuntime.InvokeVoidAsync("HKPlayer.stop");}}//后台存储的信息,用于向海康服务端请求流地址class HKCameraTemplate{public string PreviewUrlFull { get; set; } = "https://172.17.18.250:443/artemis/api/video/v2/cameras/previewURLs";public string PreviewUrl { get; set; } = "/artemis/api/video/v2/cameras/previewURLs";public string AppKey { get; set; } = "23079615";public string AppSecret { get; set; } = "eKF7H7c9EC6GcRSKo20D";public string Ip { get; set; } = "172.17.18.250";public int Port { get; set; } = 443;public bool IsHttps { get; set; } = true;}//流地址请求的bodyclass PreviewRequest{public string cameraIndexCode { get;set; }public string protocol { get; set; } = "ws";public int streamType { get; set; } = 0;public int transmode { get; set; } = 1;}class PreviewApiResponse{public string Code { get; set; }public string Msg { get; set; }public PreviewApiResponseData Data { get; set; }}class PreviewApiResponseData{public string Url { get; set; }}

 第四步 调用htplayer播放

  这部分逻辑在js中实现,其中hkpalyerdiv就是前面<div>的id,szBasePath就是官网下载的海康web播放库 H5player_2.1.3中bin里面的全部内容,我方在了wwwroot/hkplayer 文件夹中了。

var h = {cameras: {},play: function (wsurl) {if (!h.plugin) {h.plugin = new JSPlugin({szId: 'hkplayerdiv', //需要英文字母开头 必填szBasePath: './hkplayer'});}h.plugin.JS_Resize();let playURL = wsurl;let mode = 0;h.plugin.JS_Play(playURL,{playURL, // 流媒体播放时必传mode, // 解码类型:0=普通模式; 1=高级模式 默认为0// 设置直连时的认证参数等// ...},0//curIndex).then(() => {},(err) => {console.info('JS_Play failed:', err);});},stop: function () {h.plugin.JS_Stop(0).then(() => {},(err) => {console.info('JS_Stop failed:', err);});}
};
window.HKPlayer = h;

   如果一切顺利,就可以播放摄像头啦~~~

总结

  网页播放摄像头需要通过web socket,因为网页不支持rtsp协议,因此需要服务端进行协议转换(我的第一篇博客就讲了如何将rtsp转web socket以及如何在网页中播放)。海康服务器已经做了协议转换,并提供了ws的url,并且提供了h5player.js库,该库中可以对h265,h264解码播放,因此本文才能够实现网页摄像头的在线浏览。

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

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

相关文章

Python编码系列—Python命令模式:将请求封装为对象

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

CentOS8.5.2111(3)实验之DHCP服务器架设

一、实验目标 1&#xff0e;掌握DHCP服务器的主配置文件各项申明参数及操作及其含义 2. 具备DHCP 服务器、中继服务器的配置能力 3. 具备测试客户端正常获取服务器分配地址的能力 4. 具备DHCP服务器故障排除能力 二、实训原理/流程 &#xff08;一&#xff09;项目背景 …

python爬虫案例——抓取链家租房信息(8)

文章目录 1、任务目标2、分析网页3、编写代码1、任务目标 目标站点:链家租房版块(https://bj.lianjia.com/zufang/) 要求:抓取该链接下前5页所有的租房信息,包括:标题、详情信息、详情链接、价格 如: 2、分析网页 用浏览器打开链接,按F12或右键检查,进入开发者模式;因…

首屏优化之:SSR(服务端渲染)

引言 今天我们来聊一下首屏优化之SSR-服务端渲染&#xff08;Server-Side Rendering&#xff09;。 可能很多朋友并不了解什么是 SSR&#xff0c;包括在工作中写的网站是什么类型的也不太清楚&#xff0c;是 CSR 还是 SSR&#xff1f;作者在阅读过大量的文章之后&#xff0c;…

一文上手SpringSecurity【二】

书接上回,我们直接引入了spring security的依赖,之后啥也没有干,在访问接口的时候, 就需要认证之后才能访问了 ,咱们没有主动干啥,那肯定有人帮助我们干啥了,这一切都利益出spring boot自动装配机制,下面咱们就看看spring security的自动装配,帮助我们干啥了. 一、Spring Secur…

如何查看上网记录及上网时间?5种按步操作的方法分享!【小白也能学会!】

“知己知彼&#xff0c;百战不殆”&#xff0c;在数字时代&#xff0c;了解自己的上网行为和时长&#xff0c;不仅能帮助我们更好地管理时间&#xff0c;还能提升工作效率和生活质量。 今天&#xff0c;我们就来分享五种简单易懂的方法&#xff0c;即便是网络小白也能轻松学会…

某系统超级管理员密码重置通用型

故事的起因是意外发现某站点系统存在接口泄露&#xff0c;并且此接口可直接实现超级管理员密码重置&#xff0c;查ico找到用这个系统的站点&#xff0c;发现均存在此漏洞 首先打开系统站点&#xff0c;F12或者鼠标右键检查&#xff0c;然后刷新页面&#xff0c;在网络这里找到…

ECCV`24 | 高保真目标修复新SOTA!复旦智象开源CAT-Diffusion,语义视觉双一致

文章链接&#xff1a;https://arxiv.org/pdf/2409.08260 Github链接&#xff1a;https://github.com/Nnn-s/CATdiffusion 总结速览 解决的问题: 单一U-Net在所有去噪步骤中对齐文本提示和视觉对象不足以生成期望的对象。 扩散模型的复杂采样空间中无法保证对对象生成的可控性…

物流货运托运发货单二联三联打印软件定制 佳易王物流单管理系统操作教程

一、前言 物流货运托运发货单二联三联打印软件定制 佳易王物流单管理系统操作教程 1、软件为绿色免安装版&#xff0c;解压即可使用&#xff0c;已经内置数据库&#xff0c;不需再安装。 2、软件下载可以到本文章最后点击官网卡片下。 二、软件程序教程 1、如图&#xff0c;…

Html 转为 MarkDown

在 RAG 中,通常需要将 HTML 转为 Markdown,有很多第三方 API 都支持 HTML 的转换,本文使用一个代码文档的例子 https://www.joinquant.com/help/api/help#name:Stock,将聚宽 API 转为 Markdown。本文通过两种方式进行实现,使用收费和开源的解决方案。聚宽 API 格式转为 Ma…

crypto-js解密报错malformed utf-8 data

在进行加解密处理时出现这个问题。 但是当在一个完整程序运行环境内加密字符串&#xff0c;解密字符串是没问题的。 当把加密的字符存储到txt文件&#xff0c;在读取解密时出现错误无法解密。 最后&#xff0c;使用res.replace(/\s/g,‘’)正则过滤掉txt文件内的空格就成功了。…

爆火!大模型算法岗 100 道面试题全解析,赶紧收藏!

大模型应该是目前当之无愧的最有影响力的AI技术&#xff0c;它正在革新各个行业&#xff0c;包括自然语言处理、机器翻译、内容创作和客户服务等等&#xff0c;正在成为未来商业环境的重要组成部分。 截至目前大模型已经超过200个&#xff0c;在大模型纵横的时代&#xff0c;不…

【Kubernetes】常见面试题汇总(四十四)

目录 100.什么是容器资源监视&#xff1f; 101.副本集和复制控制器之间有什么区别&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 69-113 …

mov视频怎么转换成mp4?这几种转换方法值得收藏起来!

mov视频怎么转换成mp4&#xff1f;MOV格式&#xff0c;作为苹果专属的产物&#xff0c;它在非苹果体系下的兼容性常常受限&#xff0c;导致用户可能在非苹果软件平台上遭遇播放难题&#xff0c;甚至无法顺利加载视频内容&#xff0c;而且&#xff0c;MOV格式以其独特的压缩技术…

干货 | 2024制造业数字化现状调查白皮书(免费下载)

导读&#xff1a;在这本白皮书中&#xff0c;我们询问了制造商有关数字化转型的工作情况、2024 年的优先事项和可持续性。研究结果清楚地表明&#xff0c;在数字化方面处于领先地位的制造商转型项目比那些没有规划或刚刚起步的项目实现的价值要大得多。 加入知识星球或关注下方…

青动CRM-E售后V2.0.4

CRM售后管理系统&#xff0c;旨在助力企业销售售后全流程精细化、数字化管理&#xff0c;主要功能&#xff1a;客户、合同、工单、任务、报价、产品、库存、出纳、收费&#xff0c;适用于&#xff1a;服装鞋帽、化妆品、机械机电、家具装潢、建材行业、快销品、母婴用品、办公用…

只需要两步制作GIF动态图,方便快捷,制作动态表情包的利器!

推荐阅读&#xff1a;Python制作进度条&#xff0c;18种方式全网最全&#xff01;&#xff08;不全去你家扫厕所&#xff01;&#xff09; 在日常生活中肯定会接触到gif&#xff0c;例如在写文章的时候&#xff0c;有时需要将自己的代码的运行结果展示出来&#xff0c;如果放一…

05-成神之路_ambari_Ambari实战-013-代码生命周期-metainfo-configFiles详解

1.Redis 集群 metainfo.xml 示例 <?xml version"1.0"?> <metainfo><schemaVersion>2.0</schemaVersion><services><service><!-- Redis 集群服务的基本信息 --><name>REDIS</name><displayName>Redi…

VulnHub-SickOs1.1靶机笔记

SickOs1.1靶机笔记 概述 Vulnhub的靶机sickos1.1 主要练习从互联网上搜取信息的能力&#xff0c;还考察了对代理使用&#xff0c;目录爆破的能力&#xff0c;很不错的靶机 靶机地址&#xff1a; 链接: https://pan.baidu.com/s/1JOTvKbfT-IpcgypcxaCEyQ?pwdytad 提取码: yt…

Kali Linux上安装远程桌面服务VNC

在Kali Linux上安装远程桌面服务VNC&#xff0c;可以按照以下步骤进行&#xff1a; 一、安装VNC Server 更新软件包列表&#xff1a; 在终端中运行以下命令&#xff0c;以确保你的软件包列表是最新的。 sudo apt update在执行更新之前会先验证当前账号密码&#xff0c;输入密码…