在 Blazor Web Assembly 应用程序中显示本地机器摄像头源

New*_*bee 8 html javascript blazor blazor-client-side asp.net-blazor

我已经将我的问题归结为样板 Blazor Web Assembly 应用程序。

该项目直接来自向导,添加了以下代码。

  1. 我已将 Index.razor 页面更改为:
@page "/"
@inject IJSRuntime JSRuntime;
@using System.Drawing;
@using System.IO;

<div>
    <h1>Video Test</h1>
</div>

<video id="video" width="640" height="480" autoplay></video>

<div>
    <button type="button" class="btn btn-primary" @onclick="StartVideo">Click Me</button>
</div>


@code {

    async Task StartVideo()
    {
        await JSRuntime.InvokeVoidAsync("startVideo");
    }

}
Run Code Online (Sandbox Code Playgroud)

我有一个像这样附加的 JavaScript 页面:

function startVideo() {
    alert("Test Alert!");

    var video = document.getElementById('video');

    if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
        navigator.mediaDevices.getUserMedia({ video: true }).then(function (stream) {
            video.src = window.URL.createObjectURL(stream);
            video.srcObject = stream;
            video.play();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

该应用程序编译没有问题。当我运行它并单击按钮时,我收到警报。我添加到警报以确认 Java 脚本实际上正在运行。

Chrome 浏览器请求允许使用我的网络摄像头,我授予了权限。

我的网络摄像头启动,(当摄像头处于活动状态时,我的计算机有一个指示灯显示)。

但是,页面上没有显示任何内容。我猜测将我的相机流绑定到标签很简单。在我的下一次迭代中,我将拍摄视频源的快照。目前,我只想在页面上显示提要。

我是否必须通过 C# 代码块路由绑定,还是可以像我在这里所做的那样?将 Javascript 直接绑定到 HTML 元素?

小智 5

我相信您在基于 chromium 的浏览器中遇到问题,因为 createObjectURL 已被弃用。对于 Chrome 和新的 MS Edge 浏览器(使用 chromium),您所需要的只是包含 srcObject 和 play 的行。我在 Chrome、Firefox 和新 Edge 中测试了以下代码。

function startVideo() {
    alert("Test Alert!");

    var video = document.getElementById('video');

    if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
        navigator.mediaDevices.getUserMedia({ video: true }).then(function (stream) {
            try {
                video.srcObject = stream;
            } catch (error) {
                video.src = window.URL.createObjectURL(stream);
            }
            video.play();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)


New*_*bee 1

问题在于使用 Chrome。

它在 MS Edge 中运行没有问题。

我在纯 HTML 页面上尝试了相同的代码,不包含 Blazor 元素,并得到了相同的结果。这是由 Chrome 浏览器或笔记本电脑系统设置中的设置引起的。

来回答这个问题。不,绑定不必通过 C# 代码。javascript可以直接连接到HTML。