从麦克风听到传入的音频

Vin*_*pin 1 c# sockets network-programming naudio

我只是想听听我对使用NAudio的麦克风的说法,这是我的代码到目前为止,但问题是我听不到任何声音.任何帮助,将不胜感激.

public partial class frmMain : Form
    {
        private WaveIn waveIn; // Gets an audio from microphone
        private WaveOut waveOut; // Sends audio to speaker
        private BufferedWaveProvider waveProvider; // Gets an audio from stream

        public frmMain()
        {
            InitializeComponent();
        }

        private void frmMain_Load(object sender, EventArgs e)
        {
            waveOut = new WaveOut();
            waveIn = new WaveIn();
            waveProvider = new BufferedWaveProvider(waveIn.WaveFormat);

            waveOut.Init(waveProvider);             

            waveIn.DataAvailable += waveIn_DataAvailable;

            waveOut.Play();            
        }

        private void waveIn_DataAvailable(object sender, WaveInEventArgs e)
        {
            waveProvider.Read(e.Buffer, 0, e.BytesRecorded);
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            waveIn.StopRecording();
            waveIn.Dispose();
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            waveIn.StartRecording();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我将在网络编程中使用这种情况,我将数据从麦克风发送到套接字,然后在客户端,BufferedWaveProvider将读取数据,然后将其发送到扬声器.如果有更好的方法,请提出一些评论.

TIA

Cor*_*rey 8

承诺的示例代码.代码用于具有两个按钮(名为StartBtn和StopBtn)的表单.

public partial class Form1 : Form
{
    private WaveIn waveIn = null;
    private BufferedWaveProvider waveProvider = null;
    private WaveOut waveOut = null;

    public Form1()
    {
        InitializeComponent();
    }

    private void StartBtn_Click(object sender, EventArgs e)
    {
        if (waveIn != null)
            return;

        // create wave input from mic
        waveIn = new WaveIn(this.Handle);
        waveIn.BufferMilliseconds = 25;
        waveIn.RecordingStopped += waveIn_RecordingStopped;
        waveIn.DataAvailable += waveIn_DataAvailable;

        // create wave provider
        waveProvider = new BufferedWaveProvider(waveIn.WaveFormat);

        // create wave output to speakers
        waveOut = new WaveOut();
        waveOut.DesiredLatency = 100;
        waveOut.Init(waveProvider);
        waveOut.PlaybackStopped += wavePlayer_PlaybackStopped;

        // start recording and playback
        waveIn.StartRecording();
        waveOut.Play();
    }

    void waveIn_DataAvailable(object sender, WaveInEventArgs e)
    {
        // add received data to waveProvider buffer
        if (waveProvider != null)
            waveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded);
    }

    private void StopBtn_Click(object sender, EventArgs e)
    {
        if (waveIn != null)
            waveIn.StopRecording();
    }

    void waveIn_RecordingStopped(object sender, StoppedEventArgs e)
    {
        // stop playback
        if (waveOut != null)
            waveOut.Stop();

        // dispose of wave input
        if (waveIn != null)
        {
            waveIn.Dispose();
            waveIn = null;
        }

        // drop wave provider
        waveProvider = null;
    }

    void wavePlayer_PlaybackStopped(object sender, StoppedEventArgs e)
    {
        // stop recording
        if (waveIn != null)
            waveIn.StopRecording();

        // dispose of wave output
        if (waveOut != null)
        {
            waveOut.Dispose();
            waveOut = null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

尤其要注意waveIn.BufferMillisecondswaveOut.DesiredLatency设置,以减少滞后时间.

为了压缩网络传输数据,我建议使用不同的库来处理数据块.您可能需要调整该BufferMilliseconds值以减少开销并获得更好的压缩率.

作品编解码器看起来像一个合理的选择,与Opus.NET为C#.