使用naudio c#减少映射扬声器和麦克风音量的延迟

时间:2016-09-12 13:53:45

标签: c# windows audio naudio

您好我正在尝试将系统麦克风音频映射到外部声卡扬声器和外部声卡麦克风音频到系统扬声器。使用代码

 public void MapForManualCall()
    {
        try
        {
            if (db.getResultOnQuery("SELECT [Value] FROM [dbo].[SystemProperties] where property='RecordingEnabled'").Rows[0][0].ToString().Equals("YES"))
            {
                SystemMic = new NAudio.Wave.WaveInEvent();
                SystemMic.DeviceNumber = 0;
                SystemMic.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(SystemMic.DeviceNumber).Channels);

                SoundcardMic = new NAudio.Wave.WaveInEvent();
                SoundcardMic.DeviceNumber = 1;
                SoundcardMic.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(SoundcardMic.DeviceNumber).Channels);

                //NAudio.Wave.WaveInProvider waveIn = new NAudio.Wave.WaveInProvider(sourceStream);

                // used to set listen property of mic on

                var waveOutReceiver = new NAudio.Wave.WaveOut();
                waveOutReceiver.DeviceNumber = 0;
                // used to wavout caller voice on receiver speaker
                NAudio.Wave.WaveInProvider waveInProviderCaller = new NAudio.Wave.WaveInProvider(SystemMic);
                waveOutReceiver.Init(waveInProviderCaller);
                waveOutReceiver.Play();

                var waveOutCaller = new NAudio.Wave.WaveOut();
                waveOutCaller.DeviceNumber = 1;
                // used to wavout receiver voice on caller speaker
                NAudio.Wave.WaveInProvider waveInProviderReceiver = new NAudio.Wave.WaveInProvider(SoundcardMic);
                waveOutCaller.Init(waveInProviderReceiver);
                waveOutCaller.Play();


                //sourceStream.StartRecording();
                //waveOut.Play();


                // SoundcardMic.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(waveIn_DataAvailable1);
                // writer1 = new NAudio.Wave.WaveFileWriter(outputFilenameReceiver, SoundcardMic.WaveFormat);
                SoundcardMic.StartRecording();

                //SystemMic.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(waveIn_DataAvailable);
                //writer = new NAudio.Wave.WaveFileWriter(outputFilenameCaller, SystemMic.WaveFormat);
                SystemMic.StartRecording();
                //  MapSpeakerNMic();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Please Check Headphone and Device Cable Connected Properly!");
        }
    }

上面的代码工作正常,但映射之间有3-4秒的延迟。当我使用Windows 7的Listen功能尝试上述任务时,它的工作非常完美。据我说,它可能是读写缓冲区的问题。不知道怎么做......

1 个答案:

答案 0 :(得分:0)

延迟是这里的问题。录制和播放阶段存在延迟。如果不使用像ASIO这样的东西,你会发现很难将它减少到很小的值。但是,所有NAudio API都允许您指定缓冲区大小,以便您可以看到在丢失之前可以达到的低。

相关问题