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

本文关键字:麦克风 麦克 风音 延迟 扬声器 naudio 映射 使用 | 更新日期: 2023-09-27 18:06:50

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

 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功能尝试上述任务时,它工作得很完美。据我所知,它可以是读写缓冲区的问题。不知道怎么做…

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

延迟是这里的问题。在录制和回放阶段有延迟。如果不使用ASIO之类的东西,你会发现很难将其减少到较小的值。然而,所有的NAudio api都允许你指定缓冲区的大小,这样你就可以看到在你得到掉屏之前你可以达到多低。