【问题标题】:Reduce delay in mapping speaker and mic volume using naudio c#使用 naudio c# 减少映射扬声器和麦克风音量的延迟
【发布时间】:2016-09-12 13:53:45
【问题描述】:

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

 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 功能尝试执行上述任务时,它运行良好。据我所知,这可能是读写缓冲区的问题。不知道怎么弄...

【问题讨论】:

  • 您使用的是古老的 API。尝试使用 WasapiCapture/WasapiOut(Vista 及更高版本)。还要设置低缓冲区大小以避免延迟。
  • 如何设置低缓冲区大小..
  • 在 WasapiOut 构造函数中。它被称为“延迟”(我认为以毫秒为单位)。

标签: c# windows audio naudio


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多