当前位置: 首页 > news >正文

使用 SignalR 向前端推送图像

我的早期方案
public class VideoService
{const string VideoFilePath = "D:\\Users\\xx\\Desktop\\";/// <summary>/// 运行中/// </summary>public bool IsRunning { get; private set; } = false;object locker = new();CancellationTokenSource cts = new();Memory<byte>? _memoryCache;/// <summary>/// 图片base64;/// </summary>public string ImageBase64 => _memoryCache == null ? "" : Convert.ToBase64String(_memoryCache.Value.Span);/// <summary>/// 启动/// </summary>public void Startup(){if (IsRunning) return;Monitor.Enter(locker);Task.Factory.StartNew(() =>{IsRunning = true;int index = 1;while (!cts.Token.IsCancellationRequested){// 长时间运行的逻辑string filePath = Path.Combine(VideoFilePath, $"{index}.jpg");if (index >= 2) index = 1; else index++;if (File.Exists(filePath)){var bytesRead = File.ReadAllBytes(filePath);_memoryCache = new Memory<byte>(bytesRead, 0, bytesRead.Length);}}}, cts.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default).Unwrap().ContinueWith(t => {IsRunning = false;cts = new();Monitor.Exit(locker);});}/// <summary>/// 关闭/// </summary>public void Shutdown(){if (!IsRunning) return;cts.Cancel();}
}

然后从前端轮询 ImageBase64;这样的结果是图像非常不连贯

 

改造后使用  SignalR 向前端推送;

依赖 Microsoft.AspNetCore.SignalR 和 Microsoft.AspNetCore.SignalR.Client ; 在 nuget 下载

1 创建一个 Hub

/// <summary>
/// 主要用来映射连接端点
/// </summary>
public class VideoStreamHub : Hub
{// 可以在这里实现客户端连接管理
}

2 启用 SignalR 服务,并注册端点

image

3 改造 service

public class VideoService
{const string VideoFilePath = "D:\\Users\\xx\\Desktop\\";private readonly IHubContext<VideoStreamHub> _hubContext;public VideoService(IHubContext<VideoStreamHub> hubContext){_hubContext = hubContext;}/// <summary>/// 运行中/// </summary>public bool IsRunning { get; private set; } = false;object locker = new();CancellationTokenSource cts = new();Memory<byte>? _memoryCache;/// <summary>/// 图片base64;/// </summary>public string ImageBase64 => _memoryCache == null ? "" : Convert.ToBase64String(_memoryCache.Value.Span);/// <summary>/// 启动/// </summary>public void Startup(){if (IsRunning) return;Monitor.Enter(locker);cts = new();Task.Factory.StartNew(async () =>{IsRunning = true;int index = 1;while (!cts.Token.IsCancellationRequested){// 长时间运行的逻辑string filePath = Path.Combine(VideoFilePath, $"{index}.jpg");if (index >= 2) index = 1; else index++;if (File.Exists(filePath)){var bytesRead = File.ReadAllBytes(filePath);await _hubContext.Clients.All.SendAsync("ReceiveFrame", Convert.ToBase64String(bytesRead), cts.Token);  // 向前端的接收方法推送流}await Task.Delay(30, cts.Token);}cts.Token.ThrowIfCancellationRequested();}, cts.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default).Unwrap().ContinueWith(t => {if (cts.Token.IsCancellationRequested){IsRunning = false;Monitor.Exit(locker);}});}/// <summary>/// 关闭/// </summary>public void Shutdown(){if (!IsRunning) return;cts.Cancel();}
}

 

4 前端注册接收方法

@page "/"
@using BlazorAppVideo.Services
@using Microsoft.AspNetCore.SignalR.Client
@inject VideoService _VideoService
@implements IDisposable
@inject NavigationManager NavManager<PageTitle>Home</PageTitle>
<img src="@currentFrame" alt="Blazor logo" />@code {string currentFrame { get; set; } = string.Empty;private HubConnection? hubConnection;CancellationTokenSource source = new();protected override async Task OnAfterRenderAsync(bool firstRender){await base.OnAfterRenderAsync(firstRender);if (firstRender){// 启动视频服务
            _VideoService.Startup();// 创建SignalR连接hubConnection = new HubConnectionBuilder().WithUrl(NavManager.ToAbsoluteUri("/videoStreamHub")).Build();// 注册接收帧的处理方法hubConnection.On<string>("ReceiveFrame", (frame) =>{currentFrame = $"data:image/jpeg;base64,{frame}";InvokeAsync(StateHasChanged);       // 接收到新帧后更新UI
            });await hubConnection.StartAsync();}}public void Dispose(){hubConnection?.DisposeAsync();}
}

 

 改造后图像非常连贯,可用于视觉项目,从服务端推送采集的图像到前端

 

http://www.sczhlp.com/news/142535/

相关文章:

  • 新网站如何做百度关键词建设旅游网站的意义
  • 优秀网站设计效果图微商引流推广
  • 商丘网站开发大伙房水库输水工程建设局网站
  • html做网站步骤大全怎么建设淘客自己的网站、
  • 丽水网站建设Wordpress税
  • 隐私保护与联邦学习文献阅读
  • Java实习模拟面试|离散数学|概率论|金融英语|数据库实战|职业规划|期末冲刺|今日本科计科要闻速递:技术分享与学习指南 - 实践
  • 深圳做网站建设月薪多少jsp网站开发的优点
  • 广东手机微信网站制作移动应用开发是学什么
  • 网站建设项目验收意见中铁雄安建设有限公司网站
  • 公司网站建设 费用房产信息网预告是什么意思
  • 长沙专业网站设计服务旅游电子商务网络营销的概念
  • 足彩彩票网站建设微信公众号绑定网站
  • wordpress搬家后台还是老网站科技画4k纸科幻画一等奖
  • 网站建设费用细项wordpress导航怎么设置主页
  • 北京网站建设公司怎么样学校网站建设有限公司
  • 浏览器怎么连接网站的普通网站 用多说
  • 学术写作
  • 2025.9.27
  • 9.27(课后作业
  • 详细介绍:【序列晋升】45 Spring Data Elasticsearch 实战:3 个核心方案破解索引管理与复杂查询痛点,告别低效开发
  • 简单网站建设费用企业服务行业
  • 网站开发调查表tug wordpress
  • 自己做的网站如何上传文件谷歌网站站长指南
  • 关于网站建设的小故事php如何做网站
  • 网站设计欣赏国外网站内容协议
  • 免费建立个人网站的哪些平台好建公司网站要多少钱
  • 网站地图在哪里展现wordpress 用户api
  • 网站有几种浪尖设计
  • 四则运算和验证码