C# Blazor Server 调用海康H5Player播放摄像头画面
目标
调用海康综合安防平台api,通过摄像头的cameraIndexCode调用【获取监控点预览取流URLv2】api,得到websocket 的url,然后在blazor server中使用htplayer.js播放摄像头实时画面。
步骤
- 根据摄像头名字,调用【查询监控点列表v2】获取摄像头的cameraIndexCode;
- 调用【获取监控点预览取流URLv2】api,获得websocket 的url;
- 在blazor中封装组件,通过JSRuntime与htplayer.js交互;
- 将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/api/index 【API网关】中,搜查询监控点列表v2,然后点【在线调试】,其中body 里面的name 为在海康综合管理平台中的一个能够在线播放的摄像头名称(如截图中的 一号门入口3)。调用成功会得到cameraIndexCode(27eccee91fc34d38a7d9deec11c947c9)
第二步 调用【获取监控点预览取流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解码播放,因此本文才能够实现网页摄像头的在线浏览。
相关文章:
C# Blazor Server 调用海康H5Player播放摄像头画面
目标 调用海康综合安防平台api,通过摄像头的cameraIndexCode调用【获取监控点预览取流URLv2】api,得到websocket 的url,然后在blazor server中使用htplayer.js播放摄像头实时画面。 步骤 根据摄像头名字,调用【查询监控点列表v2…...
CSS实现服务卡片
CSS实现服务卡片 效果展示 CSS 知识点 回顾整体CSS知识点灵活运用CSS知识点 页面整体布局 <div class"container"><div class"card"><div class"box"><div class"icon"><ion-icon name"color-pal…...
问:如何判断系统环境是大端/小端存储?
大端存储(Big Endian)和小端存储(Little Endian)是两种不同的字节序(即字节顺序)规则,用于在计算机中存储和表示多字节数据类型(例如整数)。 概念解释 大端存储&#x…...
使用NumPy进行线性代数的快速指南
介绍 NumPy 是 Python 中用于数值计算的基础包。它提供了处理数组和矩阵的高效操作,这对于数据分析和科学计算至关重要。在本指南中,我们将探讨 NumPy 中可用的一些基本线性代数操作,展示如何通过运算符重载和内置函数执行这些操作。 元素级…...
uni-app之旅-day02-分类页面
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言创建cate分支4.1 渲染分类页面的基本结构4.2 获取分类数据4.3 动态渲染左侧的一级分类列表4.4 动态渲染右侧的二级分类列表4.5 动态渲染右侧的三级分类列表4.6 …...
鸿蒙harmonyos next flutter通信之BasicMessageChannel获取app版本号
本文将通过BasicMessageChannel获取app版本号,以此来演练BasicMessageChannel用法。 建立channel flutter代码: //建立通道 BasicMessageChannel basicMessageChannel BasicMessageChannel("com.xmg.basicMessageChannel",StringCodec());…...
【文件增量备份系统】MySQL百万量级数据量分页查询性能优化
🎯 导读:本文针对大数据量下的分页查询性能问题进行了深入探讨与优化,最初查询耗时长达12秒,通过避免全表计数及利用缓存保存总数的方式显著提升了浅分页查询速度。面对深分页时依然存在的延迟,采用先查询倒数第N条记录…...
音视频入门基础:FLV专题(12)——FFmpeg源码中,解析DOUBLE类型的ScriptDataValue的实现
一、引言 从《音视频入门基础:FLV专题(9)——Script Tag简介》中可以知道,根据《video_file_format_spec_v10_1.pdf》第80到81页,SCRIPTDATAVALUE类型由一个8位(1字节)的Type和一个ScriptDataV…...
【AI知识点】分层可导航小世界网络算法 HNSW(Hierarchical Navigable Small World)
HNSW(Hierarchical Navigable Small World)分层可导航小世界网络算法 是一种高效的近似最近邻搜索(Approximate Nearest Neighbor Search, ANN) 算法,特别适用于大规模、高维数据集的相似性检索。HNSW 基于小世界网络&…...
ubuntu图形界面右上角网络图标找回解决办法
问题现象: ubuntu图形界面右上角网络图标消失了,不方便联网: 正常应该是下图: 网络寻找解决方案,问题未解决,对于某些场景可能有用,引用过来: 参考方案 Ubuntu虚拟机没有网络图标或…...
maven安装本地jar包到本地仓库
有时候我们需要把本地的 jar 包 install 到本地的 maven 仓库,这时就需要手动install依赖项。例如,把下面的 zhdx-license-1.0.jar 安装到本地 maven 仓库的操作如下: <dependency><groupId>com.zhdx</groupId><artifa…...
1panel申请https/ssl证书自动续期
参考教程 https://hin.cool/posts/sslfor1panel.html #Acme 账户 #1panel.腾讯云dns账号 这里有一步不需要参考,腾讯云dns账号,就是子帐号授权 直接控制台搜索 访问管理 创建用户 授权搜索dns,选择第一个 点击用户名,去掉AdministratorAccess权限 5.点击api密钥生成即可…...
【C语言】指针篇 | 万字笔记
写在前面 在学习C语言过程,总有一个要点难点离不开,那就是大名鼎鼎的C语言指针,也是应为有指针的存在,使得C语言一直长盛不衰。因此不才把指针所学的所有功力都转换成这个笔记。希望对您有帮助🥰🥰 学习指…...
使用transformers调用owlv2实现开放目标检测
目录 安装Demo 安装 pip install transformersDemo from PIL import Image, ImageDraw, ImageFont import numpy as np import torch from transformers import AutoProcessor, Owlv2ForObjectDetection from transformers.utils.constants import OPENAI_CLIP_MEAN, OPENAI_…...
大数据技术:Hadoop、Spark与Flink的框架演进
大数据技术,特别是Hadoop、Spark与Flink的框架演进,是过去二十年中信息技术领域最引人注目的发展之一。这些技术不仅改变了数据处理的方式,而且还推动了对数据驱动决策和智能化的需求。在大数据处理领域,选择合适的大数据平台是确…...
Spring Boot框架下的新闻推荐技术
1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…...
相亲交友系统的社会影响:家庭结构的变化
随着互联网技术的发展,相亲交友系统已成为许多单身人士寻找伴侣的重要途径。这些平台不仅改变了人们的社交方式,还对家庭结构产生了深远的影响。本文将探讨相亲交友系统如何促使家庭结构发生变化,开发h17711347205并通过简单的Python代码示例…...
C++ 内存池(Memory Pool)详解
1. 基本概念 内存池是一种内存管理技术,旨在提高内存分配的效率。它通过预先分配一块大的内存区域(池),然后从中分配小块内存来满足应用程序的需求。这样可以减少频繁的内存分配和释放带来的性能开销。 2. 设计思路 内存池的设…...
css三角形:css画箭头向下的三角形
.arrow { position: absolute; bottom: 0; left: 50%; transform: translateX(-50%); width: 0; height: 0; border-style: solid; border-width: 8px 5px 0 5px; /* 上、左、下、右 */ bord…...
CSS属性 - animation
一、基本概念 animation是 CSS 中的一个属性,用于将通过keyframes规则定义的动画应用到元素上。它是一种简写属性,能够在一个声明中设置多个动画相关的子属性。 二、语法结构 基本语法为: animation: name duration timing - function de…...
Nanbeige像素冒险聊天终端:从start.sh到supervisorctl的完整使用流程
Nanbeige像素冒险聊天终端:从start.sh到supervisorctl的完整使用流程 1. 项目概览与环境准备 Nanbeige 4.1-3B像素冒险聊天终端是一款融合复古游戏美学与AI对话功能的创新工具。这套系统采用Streamlit框架构建,通过精心设计的像素风格界面,…...
Python无GIL时代已来:2024年CPython 3.13+无锁并发实战手册(含性能对比数据)
第一章:Python无GIL时代的演进与本质突破 Python长期以来受全局解释器锁(GIL)制约,在多核CPU上无法真正并行执行CPU密集型Python字节码。这一设计虽简化了内存管理与C扩展兼容性,却成为高性能计算、实时数据处理及现代…...
机器人控制系统(RCS)核心算法深度解析:从路径规划到任务调度
在智能制造与智能物流快速发展的背景下,机器人控制系统(RCS)作为 AGV 集群的“大脑中枢”,其核心算法的设计与优化直接决定了整个系统的运行效率和稳定性。本文系统分析了 RCS 系统中的三大核心算法——路径规划、冲突解决、任务…...
微前端进阶:WuJie + Vite + Vue3 的无界架构性能优化全攻略
1. WuJie微前端框架的核心优势 WuJie作为新一代微前端解决方案,最大的特点就是真正实现了"无界"体验。我在多个大型项目中实测发现,它完美解决了传统iframe方案存在的样式隔离、通信困难等问题。不同于single-spa这类基于路由的微前端框架&…...
OpenClaw旅行规划专家:Qwen3-14b_int4_awq自动生成行程表与预订提醒
OpenClaw旅行规划专家:Qwen3-14b_int4_awq自动生成行程表与预订提醒 1. 为什么需要AI旅行规划助手 每次计划旅行时,我总会被各种琐事淹没:查天气、比价酒店、确认景点开放时间、安排交通路线……这些重复劳动既耗时又容易出错。直到上个月尝…...
ClassGraph构建时扫描:Android注解处理的完整解决方案
ClassGraph构建时扫描:Android注解处理的完整解决方案 【免费下载链接】classgraph An uber-fast parallelized Java classpath scanner and module scanner. 项目地址: https://gitcode.com/gh_mirrors/cl/classgraph ClassGraph是一个超高速并行化的Java类…...
EasyAnimation性能优化指南:确保动画流畅运行的7个关键点
EasyAnimation性能优化指南:确保动画流畅运行的7个关键点 【免费下载链接】EasyAnimation A Swift library to take the power of UIView.animateWithDuration(_:, animations:...) to a whole new level - layers, springs, chain-able animations and mixing view…...
标普油气ETF富国(513350.SH)逆势走强、半导体承压:地缘扰动与产业逻辑共振下的ETF分化走势
4月2日,市场全天震荡调整,创业板指、科创50指数均跌超2%。板块方面,医药板块逆势走强,油气股表现活跃,光纤概念反复走强;算力租赁概念集体调整。ETF方面,标普油气ETF富国(513350.SH&…...
SEO_ 详解SEO优化中内容与外部链接的建设策略
SEO优化中内容与外部链接的建设策略 在当前互联网营销领域,SEO优化(搜索引擎优化)是提升网站流量和品牌知名度的关键手段。其中,内容与外部链接的建设策略是两大核心要素。本文将详解SEO优化中内容与外部链接的建设策略ÿ…...
电影票销售管理|基于springboot + vue电影票销售管理系统(源码+数据库+文档)
电影票销售管理系统 目录 基于springboot vue电影票销售管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springboot vue电影票销售管理系统 一、前言 博主…...
