5

私は3つのことをしようとしています:

マイクからデータにアクセスします。本当に知りたいのは、デバイスが感知した音の全体的な音量だけです。

マイクのゲインを設定します。

システムの音量を設定します。

私の Windows 開発経験はすべて C#/WPF であるため、管理を維持したいと考えています。とてつもなく高いパフォーマンスやリアルタイム処理などは必要ありません。

私は周りを見回しましたが、SlimDX はこれに適したラッパーのようですが、どこから始めればよいかわかりません。

きっとそんなに大変じゃないですか?

4

4 に答える 4

7

C# から Windows のオーディオ ミキサーにアクセスする方法を示すリンクを次に示します。

http://www.codeguru.com/csharp/csharp/cs_graphics/sound/article.php/c10931

これにより、マイクのゲインとシステムの音量を設定できます。ただし、最初の部分はもう少し複雑です。基本的に、入力の記録を開始する必要があります (DirectSound または waveInXXXX API [私の個人的なお気に入り] を使用)。各バッファがオーディオでいっぱいになると、バッファの二乗平均平方根を計算し、これを使用して音量を見積もることができます。

編集: waveInXXXX API を使用してオーディオを録音する方法を示すプロジェクトへのリンク (私が使用して正常に変更したので、動作することがわかっています) は次のとおりです。

http://www.codeproject.com/KB/audio-video/cswavrec.aspx?df=90&fid=16677&mpp=25&noise=3&sort=Position&view=Quick&select=3005817

編集2:リンクを投稿するのにうんざりしているので、オーディオバッファの二乗平均平方根を計算するための実際の式を次に示します(ここのタイプはfloat []ですが、short []を処理するように簡単に変更できます。通常は waveInXXXX から取得するもの):

public static float RootMeanSquared(ref float[] audio)
{
    double sumOfSquared = 0;
    for (int i = 0; i < audio.Length; i++)
    {
        sumOfSquared += audio[i] * audio[i];
    }
    return (float)Math.Sqrt(sumOfSquared / (double)audio.Length);
}
于 2009-07-28T02:24:20.587 に答える
4

残念ながら、深刻な遅延 (0.5 秒程度) を許容しない限り、マネージド コードからデータを確実に読み取る (またはレンダリングする) ことはできません。問題は、CLR が警告なしに一度​​に 250 ミリ秒間プロセスを中断できることです。通常、これは問題ではありませんが、アイソクロナス処理を行おうとすると重大な問題になる可能性があります。

于 2009-07-29T05:49:18.290 に答える
3

NAudioを使用して、マネージ C# でマイクからオーディオをキャプチャできます。これを行う方法の例については、デモ プロジェクトをご覧ください。上で Larry が指摘しているように、大きな遅延は期待しないでください。NAudio には、マイクの音量を設定できるようにするミキサー API のマネージド ラッパーもありますが、プログラムで正しいコントロールを取得するのは難しい場合があります。

于 2009-08-03T11:11:37.383 に答える