我正在尝试访问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>
答案 0 :(得分:0)
这种方法有几个潜在的缺陷:
1)我从你的描述中假设你想远程点击网络服务器并将麦克风中的音频作为流返回到远程浏览器。 (如果我对此不正确,请澄清你的目标)。 NAudio.Wave.DirectSoundOut 对象是直接声音COM接口的包装器。它将使用默认播放设备,这很可能是服务器上的声卡。没有音频会通过浏览器返回。
2)您正在开始方法中创建 waveOut 对象回调服务器。您的页面对象仅在回调运行时存在。一旦控件返回到浏览器,它就会消失并符合您的 waveOut 对象的垃圾回收条件。您需要在调用之间保留对象。我认为视图状态不适用于硬件包装器,所以你需要将它放在一个会话变量中,以使它在调用之间存在。
3)由于上面的#2,您的停止回叫现在无所事事。当它被调用时,应该会发现 sourceStream 和 waveOut 始终为null,因为它们不会在回调到Web服务器之间保留。它需要对付对象的持久副本。
4)出于安全原因,Web服务器可能无法访问服务器音频硬件。想象一下,如果有人设法入侵Web服务器,然后可以完全访问服务器的物理硬件。那里丑陋的潜力。但是,如果是这种情况,我认为当您尝试打开wave设备时,您会收到“拒绝访问”异常。
答案 1 :(得分:0)
使用Silverlight,您可以capture audio and play it back