4

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>
4

2 に答える 2

0

Silverlightを使用すると、オーディオをキャプチャして再生できます

于 2012-04-11T05:27:37.603 に答える
0

このアプローチには、いくつかの潜在的な欠陥があります。

1) Web サーバーにリモートでアクセスし、マイクからのオーディオをストリームとしてリモート ブラウザに返したいという説明から推測します。(私がそれについて間違っている場合は、あなたの目標を明確にしてください). NAudio.Wave.DirectSoundOutオブジェクトは、ダイレクト サウンド COM インターフェイスのラッパーです。サーバーのサウンドカードである可能性が最も高いデフォルトの再生デバイスを使用します。ブラウザからオーディオが戻ってくることはありません。

2)サーバーへのstartメソッドのコールバックで、 waveOutオブジェクトを作成しています。ページ オブジェクトは、コールバックの実行中にのみ存在します。制御がブラウザーに返されるとすぐに、制御はなくなり、 waveOutオブジェクトと共にガベージ コレクションの対象になります。呼び出し間でオブジェクトを永続化する必要があります。ビュー ステートがハードウェア ラッパーに対して機能するとは思わないため、呼び出し間で有効にするには、セッション変数に配置する必要があります。

3)ストップコールバックは、上記の #2 のため、今は何もする必要がありません。これが呼び出されると、sourceStreamwaveOutは常に null であることがわかります。これは、これらが Web サーバーへのコールバック間で永続化されていないためです。オブジェクトの永続化されたコピーに対して機能する必要があります。

4) セキュリティ上の理由から、Web サーバーはサーバーのオーディオ ハードウェアにアクセスできない場合があります。誰かが Web サーバーへのハッキングに成功し、サーバーの物理ハードウェアに完全にアクセスできるようになったと想像してみてください。そこに醜い可能性があります。ただし、この場合、wave デバイスを開こうとしたときに「アクセスが拒否されました」という例外が発生すると思います。

于 2012-04-10T21:32:45.100 に答える