ASP.NET/ C# 中的服务器端麦克风捕获

本文关键字:服务器端 麦克风 NET ASP | 更新日期: 2023-09-27 18:30:43

我正在尝试在 ASP.NET/C#中访问服务器端麦克风。

我打算做什么:

无论是加载页面还是单击按钮,C# 函数都会变为活动状态。这将获取麦克风流,并将其作为输出流播放。因此,如果您转到该页面并单击按钮,您会听到我对着麦克风说话的内容。

这就是理论。自动取款机它不起作用。在我继续之前,我想提一下这与音频聊天无关。只是关于我的麦克风输入在主页上实时播放。我完全知道您使用Flash或Silverlight进行客户端麦克风捕获。

声音输出有效。我可以轻松地从.wav文件播放,单击主页。麦克风被识别。我使用Response.Write在主页上显示麦克风的设备编号,产品名称等。所以服务器知道微观。不会引发任何异常。没有声音,但在调试时也没有发现错误。

所以我想我的代码中有一个错误。值得一提的是:设备编号,这里只是输入 0,是正确的。我用其他应用程序对其进行了测试。代码非常简单,我使用YouTube上的NAudio-Tutorial代码作为环回示例,因为我只是想弄清楚它是否有效。

这是代码:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using NAudio.Wave;
public partial class _Default : System.Web.UI.Page
{
    private NAudio.Wave.WaveIn sourceStream = null;
    private NAudio.Wave.DirectSoundOut waveOut = null;
    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = "Seite aufgerufen";
    }//protected void Page_Load(object sender, EventArgs e)
    protected void show(object sender, EventArgs e)
    {
    }
    protected void start(object sender, EventArgs e)
    {
        Label1.Text = "Aufnahme gestartet";
        int deviceNumber = 0;
        sourceStream = new NAudio.Wave.WaveIn();
        sourceStream.DeviceNumber = deviceNumber;
        sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(deviceNumber).Channels);
        NAudio.Wave.WaveInProvider waveIn = new NAudio.Wave.WaveInProvider(sourceStream);
        waveOut = new NAudio.Wave.DirectSoundOut();
        waveOut.Init(waveIn);
        sourceStream.StartRecording();
        waveOut.Play();  
    }//protected void Page_Load(object sender, EventArgs e)
    protected void stop(object sender, EventArgs e)
    {
        Label1.Text = "Aufnahme beendet";
        if (waveOut != null)
        {
            waveOut.Stop();
            waveOut.Dispose();
            waveOut = null;
        }//if (waveOut != null)
        if (sourceStream != null)
        {
            sourceStream.StopRecording();
            sourceStream.Dispose();
            sourceStream = null;
        }//if (sourceStream != null)
    }//protected void Page_Load(object sender, EventArgs e)

}//public partial class _Default : System.Web.UI.Page

以下是显示页面的代码:

<%@ Page Title="Startseite" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <h2>
        Willkommen bei ASP.NET.
    </h2>
    <p>
        Weitere Informationen zu ASP.NET finden Sie auf <a href="http://www.asp.net" title="ASP.NET-Website">www.asp.net</a>.
    </p>
    <p>
        <a href="http://go.microsoft.com/fwlink/?LinkID=152368"
            title="MSDN-ASP.NET-Dokumente">Dokumentation finden Sie auch unter ASP.NET bei MSDN</a>.
     <p>
     <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> <br />
     <asp:Button ID="Button1" runat="server" Text="Start" OnClick = "start" /><br />
     <asp:Button ID="Button2" runat="server" Text="Start" OnClick = "stop" /><br />
     </p>
</asp:Content>

ASP.NET/ C# 中的服务器端麦克风捕获

使用 Silverlight,您可以捕获音频并播放

这种方法有几个潜在的缺陷:

1)我从您的描述中推测,您想远程访问Web服务器并将麦克风中的音频作为流返回到远程浏览器。(如果我不正确,请澄清您的目标)。NAudio.Wave.DirectSoundOut 对象是直接声音 COM 接口的包装器。它将使用默认播放设备,该设备很可能是服务器上的声卡。没有音频会通过浏览器返回。

2) 您正在启动方法回调服务器中创建 waveOut 对象。页面对象仅在回调运行时存在。一旦控件返回到浏览器,它就会消失,并且有资格与您的 waveOut 对象一起进行垃圾回收。您需要在调用之间保留对象。我认为视图状态不适用于硬件包装器,因此您需要将其放在会话变量中,以便它在调用之间生存。

3)由于上面的#2,您的停止回调现在真的无关。当它被调用时,它应该发现 sourceStreamwaveOut 始终为空,因为它们在对 Web 服务器的回调之间没有持久化。它将需要针对对象的持久副本工作。

4) 出于安全原因,Web 服务器可能无法访问服务器的音频硬件。想象一下,如果有人设法入侵了Web服务器,然后完全访问了服务器的物理硬件。那里有丑陋的潜力。但是,如果是这种情况,我认为当您尝试打开wave设备时,您会得到"拒绝访问"异常。