From b9148d10f7f0476ccd1319714c9445cefdf15bc3 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 2 May 2025 17:28:21 +0800 Subject: [PATCH 01/17] =?UTF-8?q?refactor:=20=E9=98=B2=E6=AD=A2=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/VideoDevices.razor.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs index fcb4abdd807..d8f1d26b7e5 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs @@ -26,6 +26,7 @@ private async Task OnRequestDevice() var devices = await VideoDeviceService.GetDevices(); if (devices != null) { + _devices.Clear(); _devices.AddRange(devices); _items = [.. _devices.Select(i => new SelectedItem(i.DeviceId, i.Label))]; } From 06f01bc7ddb9e7819b14c1932ef79fdc662724b3 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 2 May 2025 17:28:28 +0800 Subject: [PATCH 02/17] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/VideoDevices.razor | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor index 790b0ffac35..ab0401b5950 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor @@ -22,6 +22,14 @@ private IBluetooth? BluetoothService { get; set; }
+ @foreach(var device in _devices) + { +
+
DeviceId: @device.DeviceId
+
DeviceId: @device.GroupId
+
DeviceId: @device.Label
+
+ } From 35dc99c222b66df153d5d0200e23ce8b5efaca45 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 2 May 2025 17:29:45 +0800 Subject: [PATCH 03/17] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/VideoDevices.razor | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor index ab0401b5950..15bbced6727 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor @@ -22,12 +22,14 @@ private IBluetooth? BluetoothService { get; set; }
- @foreach(var device in _devices) + @foreach (var device in _devices) {
-
DeviceId: @device.DeviceId
-
DeviceId: @device.GroupId
-
DeviceId: @device.Label
+
+
DeviceId: @device.DeviceId
+
DeviceId: @device.GroupId
+
DeviceId: @device.Label
+
} From c64dd8641581f71232e3809b7eaef82773778621 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 2 May 2025 18:16:00 +0800 Subject: [PATCH 04/17] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4=20Flip=20?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MediaDevices/DefaultMediaDevices.cs | 6 ----- .../MediaDevices/DefaultVideoDevice.cs | 5 ---- .../Services/MediaDevices/IMediaDevices.cs | 6 ----- .../Services/MediaDevices/IVideoDevice.cs | 6 ----- src/BootstrapBlazor/wwwroot/modules/media.js | 25 ------------------- 5 files changed, 48 deletions(-) diff --git a/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs b/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs index d7292f54682..b5c1316c2ee 100644 --- a/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs +++ b/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs @@ -44,10 +44,4 @@ public async Task Capture() var module = await LoadModule(); return await module.InvokeAsync("getPreviewUrl"); } - - public async Task Flip() - { - var module = await LoadModule(); - await module.InvokeAsync("flip"); - } } diff --git a/src/BootstrapBlazor/Services/MediaDevices/DefaultVideoDevice.cs b/src/BootstrapBlazor/Services/MediaDevices/DefaultVideoDevice.cs index afd44842007..083347217e4 100644 --- a/src/BootstrapBlazor/Services/MediaDevices/DefaultVideoDevice.cs +++ b/src/BootstrapBlazor/Services/MediaDevices/DefaultVideoDevice.cs @@ -41,9 +41,4 @@ public Task Capture() { return deviceService.GetPreviewUrl(); } - - public Task Flip() - { - return deviceService.Flip(); - } } diff --git a/src/BootstrapBlazor/Services/MediaDevices/IMediaDevices.cs b/src/BootstrapBlazor/Services/MediaDevices/IMediaDevices.cs index ea4988a9940..da245ae0397 100644 --- a/src/BootstrapBlazor/Services/MediaDevices/IMediaDevices.cs +++ b/src/BootstrapBlazor/Services/MediaDevices/IMediaDevices.cs @@ -41,10 +41,4 @@ public interface IMediaDevices /// /// Task GetPreviewUrl(); - - /// - /// Flip the video device. - /// - /// - Task Flip(); } diff --git a/src/BootstrapBlazor/Services/MediaDevices/IVideoDevice.cs b/src/BootstrapBlazor/Services/MediaDevices/IVideoDevice.cs index 7adffb16911..7ec86fc7edc 100644 --- a/src/BootstrapBlazor/Services/MediaDevices/IVideoDevice.cs +++ b/src/BootstrapBlazor/Services/MediaDevices/IVideoDevice.cs @@ -53,10 +53,4 @@ public interface IVideoDevice /// /// Task GetPreviewUrl(); - - /// - /// Flip the video device. - /// - /// - Task Flip(); } diff --git a/src/BootstrapBlazor/wwwroot/modules/media.js b/src/BootstrapBlazor/wwwroot/modules/media.js index 442bebfe87b..987cf91dd6e 100644 --- a/src/BootstrapBlazor/wwwroot/modules/media.js +++ b/src/BootstrapBlazor/wwwroot/modules/media.js @@ -75,31 +75,6 @@ export async function getPreviewUrl() { return url; } -export async function flip() { - const media = registerBootstrapBlazorModule("MediaDevices"); - const { stream } = media; - if (stream && stream.active) { - const tracks = stream.getVideoTracks(); - if (tracks) { - const track = tracks[0]; - const constraints = track.getSettings(); - const { facingMode } = constraints; - if (facingMode === void 0) { - console.log('facingMode is not supported'); - return; - } - - if (facingMode === "user" || facingMode.exact === "user" || facingMode.ideal === "user") { - constraints.facingMode = { ideal: "environment" } - } - else { - constraints.facingMode = { ideal: "user" } - } - await track.applyConstraints(constraints); - } - } -} - const closeStream = stream => { if (stream) { const tracks = stream.getTracks(); From 837309dc8fdc90553fabc5e4fa42de8599b96aa9 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 2 May 2025 18:16:11 +0800 Subject: [PATCH 05/17] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/VideoDevices.razor | 1 - .../Components/Samples/VideoDevices.razor.cs | 5 ----- 2 files changed, 6 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor index 15bbced6727..942cf6a4eb5 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor @@ -17,7 +17,6 @@ private IBluetooth? BluetoothService { get; set; } -
diff --git a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs index d8f1d26b7e5..1fbcfe28449 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs @@ -55,9 +55,4 @@ private async Task OnCapture() { _previewUrl = await VideoDeviceService.GetPreviewUrl(); } - - private async Task OnFlip() - { - await VideoDeviceService.Flip(); - } } From 8c64141081c8f8a7e1154614d321797af864183f Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 2 May 2025 18:16:33 +0800 Subject: [PATCH 06/17] =?UTF-8?q?test:=20=E6=9B=B4=E6=96=B0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Services/VideoDeviceTest.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/UnitTest/Services/VideoDeviceTest.cs b/test/UnitTest/Services/VideoDeviceTest.cs index 3446801668d..90c47b7c802 100644 --- a/test/UnitTest/Services/VideoDeviceTest.cs +++ b/test/UnitTest/Services/VideoDeviceTest.cs @@ -46,7 +46,6 @@ public async Task Open_Ok() Assert.Equal(".bb-video", options.VideoSelector); await service.Capture(); - await service.Flip(); var url = await service.GetPreviewUrl(); Assert.Equal("blob:https://test-preview", url); } From 95e0dcecc05a49e980bbb1d87119e21d0f36edec Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 2 May 2025 18:17:08 +0800 Subject: [PATCH 07/17] =?UTF-8?q?doc:=20=E7=A7=BB=E9=99=A4=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/VideoDevices.razor | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor index 942cf6a4eb5..4f47106fe91 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor @@ -21,16 +21,6 @@ private IBluetooth? BluetoothService { get; set; }
- @foreach (var device in _devices) - { -
-
-
DeviceId: @device.DeviceId
-
DeviceId: @device.GroupId
-
DeviceId: @device.Label
-
-
- }
From 62d32b5d6a312b6b2fc9ac1e1bcc7d15f875dc3d Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 2 May 2025 18:21:33 +0800 Subject: [PATCH 08/17] =?UTF-8?q?refactor:=20open=20=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=BF=94=E5=9B=9E=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MediaDevices/DefaultMediaDevices.cs | 4 ++-- .../MediaDevices/DefaultVideoDevice.cs | 2 +- .../Services/MediaDevices/IMediaDevices.cs | 2 +- .../Services/MediaDevices/IVideoDevice.cs | 2 +- src/BootstrapBlazor/wwwroot/modules/media.js | 23 +++++++++++++------ 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs b/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs index b5c1316c2ee..441b93ed1ca 100644 --- a/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs +++ b/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs @@ -21,10 +21,10 @@ private async Task LoadModule() return await module.InvokeAsync?>("enumerateDevices"); } - public async Task Open(MediaTrackConstraints constraints) + public async Task Open(MediaTrackConstraints constraints) { var module = await LoadModule(); - await module.InvokeVoidAsync("open", constraints); + return await module.InvokeAsync("open", constraints); } public async Task Close(string? videoSelector) diff --git a/src/BootstrapBlazor/Services/MediaDevices/DefaultVideoDevice.cs b/src/BootstrapBlazor/Services/MediaDevices/DefaultVideoDevice.cs index 083347217e4..d17ce399245 100644 --- a/src/BootstrapBlazor/Services/MediaDevices/DefaultVideoDevice.cs +++ b/src/BootstrapBlazor/Services/MediaDevices/DefaultVideoDevice.cs @@ -22,7 +22,7 @@ class DefaultVideoDevice(IMediaDevices deviceService) : IVideoDevice return ret; } - public Task Open(MediaTrackConstraints constraints) + public Task Open(MediaTrackConstraints constraints) { return deviceService.Open(constraints); } diff --git a/src/BootstrapBlazor/Services/MediaDevices/IMediaDevices.cs b/src/BootstrapBlazor/Services/MediaDevices/IMediaDevices.cs index da245ae0397..3cf98980d99 100644 --- a/src/BootstrapBlazor/Services/MediaDevices/IMediaDevices.cs +++ b/src/BootstrapBlazor/Services/MediaDevices/IMediaDevices.cs @@ -21,7 +21,7 @@ public interface IMediaDevices /// /// /// - Task Open(MediaTrackConstraints constraints); + Task Open(MediaTrackConstraints constraints); /// /// The close() method of the MediaDevices interface stops capturing media from the specified device and closes the MediaStream object. diff --git a/src/BootstrapBlazor/Services/MediaDevices/IVideoDevice.cs b/src/BootstrapBlazor/Services/MediaDevices/IVideoDevice.cs index 7ec86fc7edc..ccf4cc28e43 100644 --- a/src/BootstrapBlazor/Services/MediaDevices/IVideoDevice.cs +++ b/src/BootstrapBlazor/Services/MediaDevices/IVideoDevice.cs @@ -21,7 +21,7 @@ public interface IVideoDevice /// /// /// - Task Open(MediaTrackConstraints constraints); + Task Open(MediaTrackConstraints constraints); /// /// Close the video device with the specified selector. diff --git a/src/BootstrapBlazor/wwwroot/modules/media.js b/src/BootstrapBlazor/wwwroot/modules/media.js index 987cf91dd6e..cc0f35a3080 100644 --- a/src/BootstrapBlazor/wwwroot/modules/media.js +++ b/src/BootstrapBlazor/wwwroot/modules/media.js @@ -29,16 +29,25 @@ export async function open(options) { if (height) { constrains.video.height = { ideal: height }; } - const stream = await navigator.mediaDevices.getUserMedia(constrains); - const media = registerBootstrapBlazorModule("MediaDevices"); - media.stream = stream; - if (videoSelector) { - const video = document.querySelector(videoSelector); - if (video) { - video.srcObject = stream; + let ret = false; + try { + const stream = await navigator.mediaDevices.getUserMedia(constrains); + const media = registerBootstrapBlazorModule("MediaDevices"); + media.stream = stream; + + if (videoSelector) { + const video = document.querySelector(videoSelector); + if (video) { + video.srcObject = stream; + } } + ret = true; + } + catch (err) { + console.error("Error accessing media devices.", err); } + return ret; } export async function close(videoSelector) { From c450849c630a793cc2fef12885f4e2e6fe667b7c Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 2 May 2025 18:21:48 +0800 Subject: [PATCH 09/17] =?UTF-8?q?doc:=20=E5=A2=9E=E5=8A=A0=E6=89=93?= =?UTF-8?q?=E5=BC=80=E8=AE=BE=E5=A4=87=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/VideoDevices.razor | 6 +++--- .../Components/Samples/VideoDevices.razor.cs | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor index 4f47106fe91..1bcb15efa41 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor @@ -14,9 +14,9 @@ private IBluetooth? BluetoothService { get; set; }
- - - + + +
diff --git a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs index 1fbcfe28449..460dccbed07 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs @@ -21,6 +21,8 @@ public partial class VideoDevices private string? _previewUrl; + private bool _isOpen = false; + private async Task OnRequestDevice() { var devices = await VideoDeviceService.GetDevices(); @@ -41,7 +43,7 @@ private async Task OnOpenVideo() DeviceId = _deviceId, VideoSelector = ".bb-video" }; - await VideoDeviceService.Open(constraints); + _isOpen = await VideoDeviceService.Open(constraints); } } From 6b1b9b3f270523fddaa41bafc9e7c391b550629f Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 2 May 2025 18:25:01 +0800 Subject: [PATCH 10/17] =?UTF-8?q?test:=20=E6=9B=B4=E6=96=B0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Services/VideoDeviceTest.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/UnitTest/Services/VideoDeviceTest.cs b/test/UnitTest/Services/VideoDeviceTest.cs index 90c47b7c802..b7727a489a8 100644 --- a/test/UnitTest/Services/VideoDeviceTest.cs +++ b/test/UnitTest/Services/VideoDeviceTest.cs @@ -26,6 +26,7 @@ public async Task GetDevices_Ok() public async Task Open_Ok() { Context.JSInterop.Setup("getPreviewUrl").SetResult("blob:https://test-preview"); + Context.JSInterop.Setup("open", _ => true).SetResult(true); var service = Context.Services.GetRequiredService(); var options = new MediaTrackConstraints() @@ -36,7 +37,9 @@ public async Task Open_Ok() Width = 480, VideoSelector = ".bb-video" }; - await service.Open(options); + var open = await service.Open(options); + Assert.True(open); + await service.Close(".bb-video"); Assert.Equal("test-device-id", options.DeviceId); From 39240278c8a533cafcfab3b0b17d7e48c6efa377 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 2 May 2025 18:32:37 +0800 Subject: [PATCH 11/17] =?UTF-8?q?refactor:=20close=20=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=BF=94=E5=9B=9E=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MediaDevices/DefaultMediaDevices.cs | 4 +-- .../MediaDevices/DefaultVideoDevice.cs | 2 +- .../Services/MediaDevices/IMediaDevices.cs | 2 +- .../Services/MediaDevices/IVideoDevice.cs | 2 +- src/BootstrapBlazor/wwwroot/modules/media.js | 31 ++++++++++++------- 5 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs b/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs index 441b93ed1ca..8b9f2c68c77 100644 --- a/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs +++ b/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs @@ -27,10 +27,10 @@ public async Task Open(MediaTrackConstraints constraints) return await module.InvokeAsync("open", constraints); } - public async Task Close(string? videoSelector) + public async Task Close(string? videoSelector) { var module = await LoadModule(); - await module.InvokeVoidAsync("close", videoSelector); + return await module.InvokeAsync("close", videoSelector); } public async Task Capture() diff --git a/src/BootstrapBlazor/Services/MediaDevices/DefaultVideoDevice.cs b/src/BootstrapBlazor/Services/MediaDevices/DefaultVideoDevice.cs index d17ce399245..ebe2a6123ed 100644 --- a/src/BootstrapBlazor/Services/MediaDevices/DefaultVideoDevice.cs +++ b/src/BootstrapBlazor/Services/MediaDevices/DefaultVideoDevice.cs @@ -27,7 +27,7 @@ public Task Open(MediaTrackConstraints constraints) return deviceService.Open(constraints); } - public Task Close(string? videoSelector) + public Task Close(string? videoSelector) { return deviceService.Close(videoSelector); } diff --git a/src/BootstrapBlazor/Services/MediaDevices/IMediaDevices.cs b/src/BootstrapBlazor/Services/MediaDevices/IMediaDevices.cs index 3cf98980d99..24140322fbe 100644 --- a/src/BootstrapBlazor/Services/MediaDevices/IMediaDevices.cs +++ b/src/BootstrapBlazor/Services/MediaDevices/IMediaDevices.cs @@ -28,7 +28,7 @@ public interface IMediaDevices ///
/// /// - Task Close(string? videoSelector); + Task Close(string? videoSelector); /// /// The capture() method of the MediaDevices interface captures a still image from the specified video stream and saves it to the specified location. diff --git a/src/BootstrapBlazor/Services/MediaDevices/IVideoDevice.cs b/src/BootstrapBlazor/Services/MediaDevices/IVideoDevice.cs index ccf4cc28e43..d838d97ef95 100644 --- a/src/BootstrapBlazor/Services/MediaDevices/IVideoDevice.cs +++ b/src/BootstrapBlazor/Services/MediaDevices/IVideoDevice.cs @@ -28,7 +28,7 @@ public interface IVideoDevice /// /// /// - Task Close(string? videoSelector); + Task Close(string? videoSelector); /// /// Capture a still image from the video stream. diff --git a/src/BootstrapBlazor/wwwroot/modules/media.js b/src/BootstrapBlazor/wwwroot/modules/media.js index cc0f35a3080..ef82408e9d8 100644 --- a/src/BootstrapBlazor/wwwroot/modules/media.js +++ b/src/BootstrapBlazor/wwwroot/modules/media.js @@ -51,21 +51,30 @@ export async function open(options) { } export async function close(videoSelector) { - if (videoSelector) { - const video = document.querySelector(videoSelector); - if (video) { - video.pause(); - const stream = video.srcObject; + let ret = false; + + try { + if (videoSelector) { + const video = document.querySelector(videoSelector); + if (video) { + video.pause(); + const stream = video.srcObject; + closeStream(stream); + video.srcObject = null; + } + } + const media = registerBootstrapBlazorModule("MediaDevices"); + const { stream } = media; + if (stream && stream.active) { closeStream(stream); - video.srcObject = null; } + media.stream = null; + ret = true; } - const media = registerBootstrapBlazorModule("MediaDevices"); - const { stream } = media; - if (stream && stream.active) { - closeStream(stream); + catch (err) { + console.error("Error closing media devices.", err); } - media.stream = null; + return ret; } export async function getPreviewUrl() { From b701625f67e0a2fb76136d199204bdd1e087d621 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 2 May 2025 18:32:44 +0800 Subject: [PATCH 12/17] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/VideoDevices.razor | 2 +- .../Components/Samples/VideoDevices.razor.cs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor index 1bcb15efa41..359a5040826 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor @@ -14,7 +14,7 @@ private IBluetooth? BluetoothService { get; set; }
- +
diff --git a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs index 460dccbed07..560a07c195e 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs @@ -43,12 +43,13 @@ private async Task OnOpenVideo() DeviceId = _deviceId, VideoSelector = ".bb-video" }; - _isOpen = await VideoDeviceService.Open(constraints); + _isOpen = await VideoDeviceService.Open(constraints); } } private async Task OnCloseVideo() { + _isOpen = false; _previewUrl = ""; await VideoDeviceService.Close(".bb-video"); } From 5ec815d87c71d9688fc4a1d365f8135b4c9147f1 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 2 May 2025 18:32:49 +0800 Subject: [PATCH 13/17] =?UTF-8?q?test:=20=E6=9B=B4=E6=96=B0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Services/VideoDeviceTest.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/UnitTest/Services/VideoDeviceTest.cs b/test/UnitTest/Services/VideoDeviceTest.cs index b7727a489a8..7b19d907d64 100644 --- a/test/UnitTest/Services/VideoDeviceTest.cs +++ b/test/UnitTest/Services/VideoDeviceTest.cs @@ -27,6 +27,7 @@ public async Task Open_Ok() { Context.JSInterop.Setup("getPreviewUrl").SetResult("blob:https://test-preview"); Context.JSInterop.Setup("open", _ => true).SetResult(true); + Context.JSInterop.Setup("close", _ => true).SetResult(true); var service = Context.Services.GetRequiredService(); var options = new MediaTrackConstraints() @@ -40,7 +41,8 @@ public async Task Open_Ok() var open = await service.Open(options); Assert.True(open); - await service.Close(".bb-video"); + var close = await service.Close(".bb-video"); + Assert.True(close); Assert.Equal("test-device-id", options.DeviceId); Assert.Equal("user", options.FacingMode); From 0471602dc0e41144da0d491771c89fd289217b5f Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 2 May 2025 18:34:29 +0800 Subject: [PATCH 14/17] =?UTF-8?q?doc:=20=E5=A2=9E=E5=8A=A0=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E9=80=89=E6=8B=A9=E8=AE=BE=E5=A4=87=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/VideoDevices.razor.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs index 560a07c195e..3ee7cf47ea0 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs @@ -31,6 +31,8 @@ private async Task OnRequestDevice() _devices.Clear(); _devices.AddRange(devices); _items = [.. _devices.Select(i => new SelectedItem(i.DeviceId, i.Label))]; + + _deviceId = _items.FirstOrDefault()?.Value; } } From 00f1cf12b81ef96b4fc41e070e450adb6f880115 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 2 May 2025 18:36:01 +0800 Subject: [PATCH 15/17] =?UTF-8?q?doc:=20=E5=A2=9E=E5=8A=A0=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=85=B3=E9=97=AD=E8=A7=86=E9=A2=91=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/VideoDevices.razor.cs | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs index 3ee7cf47ea0..106cf49e745 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs @@ -8,7 +8,7 @@ namespace BootstrapBlazor.Server.Components.Samples; /// /// VideoDevice Component /// -public partial class VideoDevices +public partial class VideoDevices : IAsyncDisposable { [Inject, NotNull] private IVideoDevice? VideoDeviceService { get; set; } @@ -60,4 +60,23 @@ private async Task OnCapture() { _previewUrl = await VideoDeviceService.GetPreviewUrl(); } + + private async Task DisposeAsync(bool disposing) + { + if (disposing) + { + await OnCloseVideo(); + } + } + + /// + /// + /// + /// + /// + public async ValueTask DisposeAsync() + { + await DisposeAsync(true); + GC.SuppressFinalize(this); + } } From 38170c86aeed5fe66950890a2e174bd72d7ade93 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 2 May 2025 18:37:13 +0800 Subject: [PATCH 16/17] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4=E6=B0=B4?= =?UTF-8?q?=E5=B9=B3=E7=BF=BB=E8=BD=AC=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/VideoDevices.razor.css | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.css b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.css index 386d7ebb984..75a4e73f32a 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.css +++ b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.css @@ -2,7 +2,6 @@ min-height: 240px; height: auto; width: auto; - transform: scaleX(-1); margin-top: 1rem; display: block; } @@ -10,7 +9,6 @@ .bb-image { border: 1px solid var(--bs-border-color); border-radius: var(--bs-border-radius); - transform: scaleX(-1); margin-top: 1rem; display: block; } From 8286a537edaee6f5bee50aba14e45c9b902a289a Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 2 May 2025 18:39:47 +0800 Subject: [PATCH 17/17] chore: bump version 9.6.1-beta02 Co-Authored-By: ChenHan819 <58500809+chenhan819@users.noreply.github.com> --- src/BootstrapBlazor/BootstrapBlazor.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/BootstrapBlazor.csproj b/src/BootstrapBlazor/BootstrapBlazor.csproj index 0e6eb0e364b..1a7f7ef8660 100644 --- a/src/BootstrapBlazor/BootstrapBlazor.csproj +++ b/src/BootstrapBlazor/BootstrapBlazor.csproj @@ -1,7 +1,7 @@  - 9.6.1-beta01 + 9.6.1-beta02