From 40afab9f930e8c7ec7ecb2aa91515f084ddea8b1 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Thu, 25 Dec 2025 13:43:01 +0800 Subject: [PATCH 1/3] feat(HikVision): add IsStartRecord parameter --- .../Components/HikVisionWebPlugin.razor.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/components/BootstrapBlazor.HikVision/Components/HikVisionWebPlugin.razor.cs b/src/components/BootstrapBlazor.HikVision/Components/HikVisionWebPlugin.razor.cs index 3e376715..6ae5a096 100644 --- a/src/components/BootstrapBlazor.HikVision/Components/HikVisionWebPlugin.razor.cs +++ b/src/components/BootstrapBlazor.HikVision/Components/HikVisionWebPlugin.razor.cs @@ -115,6 +115,16 @@ public partial class HikVisionWebPlugin /// public bool IsRealPlaying { get; private set; } + /// + /// 获得 是否已经打开声音 + /// + public bool IsOpenSound { get; private set; } + + /// + /// 获得 是否开始录像 + /// + public bool IsStartRecord { get; private set; } + /// /// /// @@ -164,6 +174,7 @@ public async Task Logout() { await InvokeVoidAsync("logout", Id); } + IsStartRecord = false; IsRealPlaying = false; IsLogin = false; await TriggerLogout(); @@ -221,6 +232,7 @@ public async Task StopRealPlay() { await InvokeVoidAsync("stopRealPlay", Id); IsRealPlaying = false; + IsStartRecord = false; await TriggerStopRealPlay(); } } @@ -281,6 +293,7 @@ public async Task OpenSound() { var code = await InvokeAsync("openSound", Id); ret = code == 100; + IsOpenSound = true; } return ret; } @@ -296,6 +309,7 @@ public async Task CloseSound() { var code = await InvokeAsync("closeSound", Id); ret = code == 100; + IsOpenSound = false; } return ret; } @@ -378,6 +392,7 @@ public async Task StartRecord() if (IsLogin && IsRealPlaying) { ret = await InvokeAsync("startRecord", Id); + IsStartRecord = ret; } return ret; } @@ -392,6 +407,10 @@ public async Task StopRecord() if (IsLogin && IsRealPlaying) { ret = await InvokeAsync("stopRecord", Id); + if (ret) + { + IsStartRecord = false; + } } return ret; } From 819dbcfc1ef774f61483453778b56349a3c56332 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Thu, 25 Dec 2025 13:43:21 +0800 Subject: [PATCH 2/3] chore: bump version 10.0.9 --- .../BootstrapBlazor.HikVision/BootstrapBlazor.HikVision.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/BootstrapBlazor.HikVision/BootstrapBlazor.HikVision.csproj b/src/components/BootstrapBlazor.HikVision/BootstrapBlazor.HikVision.csproj index 6f193e44..6f5a30de 100644 --- a/src/components/BootstrapBlazor.HikVision/BootstrapBlazor.HikVision.csproj +++ b/src/components/BootstrapBlazor.HikVision/BootstrapBlazor.HikVision.csproj @@ -1,7 +1,7 @@ - 10.0.7 + 10.0.9 From 26c6a17ed60efe8f69478ea8f2b97bcc091148f6 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Thu, 25 Dec 2025 14:05:31 +0800 Subject: [PATCH 3/3] =?UTF-8?q?refactor:=20=E6=8A=93=E5=9B=BE=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=AE=BE=E7=BD=AE=E6=96=87=E4=BB=B6=E5=90=8D=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/HikVisionWebPlugin.razor.cs | 38 ++++--------------- .../wwwroot/hikvision.js | 26 ++++++++----- 2 files changed, 23 insertions(+), 41 deletions(-) diff --git a/src/components/BootstrapBlazor.HikVision/Components/HikVisionWebPlugin.razor.cs b/src/components/BootstrapBlazor.HikVision/Components/HikVisionWebPlugin.razor.cs index 6ae5a096..8106b140 100644 --- a/src/components/BootstrapBlazor.HikVision/Components/HikVisionWebPlugin.razor.cs +++ b/src/components/BootstrapBlazor.HikVision/Components/HikVisionWebPlugin.razor.cs @@ -334,54 +334,30 @@ public async Task SetVolume(int value) /// 抓图方法并且下载方法 /// /// - public async Task CapturePictureAndDownload() + public async Task CapturePictureAndDownload(string? fileName = null, CancellationToken token = default) { + var ret = false; if (IsLogin && IsRealPlaying) { - await InvokeVoidAsync("capturePictureAndDownload", Id); + ret = await InvokeAsync("capturePictureAndDownload", token, Id, fileName); } + return ret; } - private TaskCompletionSource? _captureTaskCompletionSource = null; - /// /// 抓图方法返回 实例 /// /// - public async Task CapturePicture(CancellationToken token = default) + public async Task CapturePicture(string? fileName = null, CancellationToken token = default) { - IJSStreamReference? ret = null; + var ret = false; if (IsLogin && IsRealPlaying) { - _captureTaskCompletionSource = new(); - - try - { - await InvokeVoidAsync("capturePicture", token, Id); - ret = await _captureTaskCompletionSource.Task; - } - catch (Exception ex) - { - _captureTaskCompletionSource.SetException(ex); - } + ret = await InvokeAsync("capturePicture", token, Id, fileName); } return ret; } - /// - /// 抓图返回文件流方法 由 Javascript 调用 - /// - /// - /// - [JSInvokable] - public async Task TriggerReceivePictureStream(IJSStreamReference stream) - { - if (_captureTaskCompletionSource != null) - { - _captureTaskCompletionSource.SetResult(stream); - } - } - /// /// 开始录像方法 /// diff --git a/src/components/BootstrapBlazor.HikVision/wwwroot/hikvision.js b/src/components/BootstrapBlazor.HikVision/wwwroot/hikvision.js index 2f803dad..8d190e54 100644 --- a/src/components/BootstrapBlazor.HikVision/wwwroot/hikvision.js +++ b/src/components/BootstrapBlazor.HikVision/wwwroot/hikvision.js @@ -409,24 +409,24 @@ export async function setVolume(id, value) { return code; } -export async function capturePicture(id) { +export function capturePicture(id, szFileName) { const vision = Data.get(id); const { realPlaying } = vision; if (realPlaying !== true) { - return ""; + return false; } try { - const base64 = await WebVideoCtrl.I_CapturePicData(); - if (base64) { - const bytes = base64ToArray(base64); - return DotNet.createJSStreamReference(bytes.buffer); + if (!szFileName) { + szFileName = `capture_${new Date().getTime()}`; } + WebVideoCtrl.I_CapturePic(szFileName); + return true; } catch (ex) { console.log(ex); - return null; + return false; } } @@ -443,28 +443,34 @@ const base64ToArray = base64String => { return bytes; } -export async function capturePictureAndDownload(id) { +export async function capturePictureAndDownload(id, szFileName) { const vision = Data.get(id); const { realPlaying } = vision; if (realPlaying !== true) { - return; + return false; } + let ret = false; try { const base64 = await WebVideoCtrl.I_CapturePicData(); if (base64) { + if (!szFileName) { + szFileName = `capture_${new Date().getTime()}.jpg` + } const anchorElement = document.createElement('a'); anchorElement.href = `data:image/jpg;base64,${base64}`; - anchorElement.download = `capture_${new Date().getTime()}.jpg`; + anchorElement.download = szFileName; document.body.appendChild(anchorElement); anchorElement.click(); document.body.removeChild(anchorElement); + ret = true; } } catch (ex) { console.log(ex); } + return ret; } export async function startRecord(id) {