使用NAudio C#减少映射扬声器和麦克风音量的延迟 [英] Reduce delay in mapping speaker and mic volume using naudio c#

查看:698
本文介绍了使用NAudio C#减少映射扬声器和麦克风音量的延迟的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Hello i am trying to map system mic audio to external sound card speaker and external sound card mic audio to system speaker. By using code

 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功能进行上述任务时,它的工作原理非常完美.对我来说,这可能是读写缓冲区的问题.不知道该怎么做...

Code above works perfect but there is delay of 3-4 seconds between mapping. When i am trying above task using Listen functionalities of windows 7 it works perfect. According to me it can be issue of reading writing buffer. Don't know how to do it...

推荐答案

延迟是这里的问题.在记录和播放阶段存在延迟.您会发现,很难在不使用ASIO之类的情况下将其减小到较小的值.但是,所有NAudio API都允许您指定缓冲区大小,这样您就可以在退出之前了解可以达到的水平.

Latency is the issue here. There is latency at the recording and playback stage. You will find it very hard to reduce this to small values without using something like ASIO. However, all the NAudio APIs allow you to specify buffer sizes so you can see how low you can go before you get dropouts.

这篇关于使用NAudio C#减少映射扬声器和麦克风音量的延迟的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆