0

一時的なwavファイルを使用せずに、オーディオを同時に録音および再生しようとしています。そして後で、VOIP チャット プログラムを作成したいと思います。

C# でオーディオをキャプチャして再生するために Naudio ライブラリを使用しましたが、非常にうまく機能しているようです。以下は私が書いたC#コードです:

using System.IO.Ports;
using NAudio.Wave;
using System.IO;

namespace VOIP
{
    public partial class Form1 : Form
    {
        WaveIn wab = new WaveIn();    
        MemoryStream s;        
        int k;


        public Form1()
        {
            InitializeComponent();
            wab.BufferMilliseconds = 100;
            wab.NumberOfBuffers=5;
            wab.DataAvailable += new EventHandler<WaveInEventArgs>(wa_DataAvailable);           
        }

        void wa_DataAvailable(object sender, WaveInEventArgs e)
        {                 

            Play(e.Buffer);         

        }

        private void Play(byte[] p)
        {
            WaveOut ou = new WaveOut();
            s = new MemoryStream(p);
            RawSourceWaveStream r = new RawSourceWaveStream(s, wab.WaveFormat);
            ou.Init(r);
            ou.Play();
            ou.Stop();
            ou.Dispose();
            s.Dispose();
            r.Dispose();

        }

        private void Form1_Load(object sender, EventArgs e)
        {


        }

        private void button1_Click(object sender, EventArgs e)
        {
           if (button1.Text == "Stop")
            {
                wab.StopRecording();
                button1.Text = "Record";
            }
           else if (button1.Text == "Record")
            {
                wab.StartRecording();
                button1.Text = "Stop";
            }            
        }


    }
}

問題は「再生」メソッドにあります。データが利用可能になるたびにウェーブアウトオブジェクトが作成および破棄されるため、クリック音が聞こえます。オブジェクトを作成および破棄するこの方法を回避し、代わりに1つのオブジェクトを作成してから新しいデータで初期化する方法はありますか? また、このプログラムが消費するメモリが増え続けていることもわかりました。

前もって感謝します。サナタン

4

1 に答える 1

0

BufferedWaveProvider を使用し、オーディオが到着したら、それを解凍して BufferedWaveProvider に追加します。次に、BufferedWaveProvider から常に再生される WaveOut の単一のインスタンスを用意します。

NAudioDemo のソース コードは、チャットの例でこれを行う方法を示しています。

于 2012-10-31T07:13:53.793 に答える