2012-04-10 19 views
4

ASP.NET/C#のサーバー側マイクロフォンにアクセスしようとしています。私がやることを計画しています何ASP.NET/C#のサーバー側マイクロフォンキャプチャ

どちらのページをロードすると、またはボタンをクリックすると、C#の-functionがアクティブになります。これは、マイクストリームを取得し、それを出力ストリームとして再生します。あなたがページに行き、ボタンをクリックすると、私はマイクロホンに何を話すのか聞いてきます。

これは理論です。 Atmは動作しません。私が続ける前に、私はそれが音声チャットではないことを言いたいと思います。ちょうど私のマイク入力がホームページ上でライブ演奏されています。クライアントサイドのマイクロフォンキャプチャに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

Windowsフォームアプリケーションから機能しますか? –

+2

デフォルトのNAudio.Wave.DirectSoundOut()オブジェクトがブラウザを介してストリーミングされると思われる原因は何ですか?私はそれがサーバー上のデフォルトのサウンドデバイスに出力されると思う。 – user957902

+0

Windowsフォームアプリで完璧に動作するようです。だからこそ、私はその問題について何か不思議です。また、DirectSoundOut()がストリームからファイルを取り出したときにうまく動作します。私はDirectSoundOut以外の何かを試してみるでしょう、多分それは動作します。 – yetanotheruser

答えて

0

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

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

2)あなたが戻ってサーバーに開始メソッド呼び出しであなたのwaveOutオブジェクトを作成しています。ページオブジェクトは、コールバックの実行中にのみ存在します。コントロールがブラウザに返されるとすぐに、そのユーザーはwaveOutオブジェクトと共にガベージコレクションの対象となります。呼び出しの間にオブジェクトを保持する必要があります。私はビューステートがハードウェアラッパーのために働くとは思わないので、それをコールの間に生きるためにセッション変数に入れる必要があります。

3)ストップ上記の#2のため、コールバックは実際には何もしません。呼び出されると、sourceStreamwaveOutは、Webサーバーへのコールバックの間に保持されていないため、常にnullになります。オブジェクトの永続コピーに対して作業する必要があります。

4)セキュリティ上の理由から、Webサーバーはサーバーのオーディオハードウェアにアクセスできない場合があります。誰かがWebサーバーをハックしてサーバーの物理ハードウェアに完全にアクセスできたとします。そこには醜い潜在性がある。しかし、このような場合は、あなたがwaveデバイスを開こうとしたときに "アクセス拒否"例外が発生すると思います。

+0

質問が解決しました。私は別のコーデックであっても、UDP上でのストリーミングを可能にする別のアプローチを使用しています。働いているようだ。 – yetanotheruser

+1

@yetanotheruserあなたが答えとしてあなたのソリューションを投稿し、それを受け入れるといいですね。実際、その行動は[完全に受け入れられ、奨励されている](http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/)=) – jadarnel27

0

Silverlightを使用すると、capture audio and play it back

+0

FYI他のサイトへのリンクだけである回答は怒られます。 [faq#deletion]を参照してください - *質問に根本的に答えないアンサーは削除されるかもしれません。これには外部サイトへのリンク以上の回答*が含まれます。また、これらのメタ投稿を参照してください:[リンクだけを含む回答は本当に良い答えですか?](http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-良い回答/ 8259#8259)と[受け入れ可能な答えは何ですか](http://meta.stackexchange.com/questions/118582/what-is-an-acceptable-answer/118694#118694)。 – jadarnel27

関連する問題