2016-09-12 11 views
0

こんにちは、システムのマイクオーディオを外部のサウンドカードスピーカーと外部サウンドカードのマイクオーディオをシステムスピーカーにマッピングしようとしています。コードを使用してnaudioを使用してスピーカーとマイクのマッピングを遅らせるC#

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のリッスン機能を使用して上記の作業をしようとしているとき、それは完璧に動作します。私によれば、それは書き込みバッファを読むことの問題になる可能性があります。それを行う方法がわからない...

+0

古代のAPIを使用しています。 WasapiCapture/WasapiOut(Vista以上)を使用してみてください。遅延を避けるため、バッファーサイズを小さく設定してください。 – apocalypse

+0

低いバッファサイズを設定する方法。 –

+0

In WasapiOutコンストラクタ。これは「レイテンシ」と呼ばれています(私は思っています)。 – apocalypse

答えて

0

ここでレイテンシが問題です。録音と再生のステージにはレイテンシがあります。 ASIOのようなものを使わないと、これを小さな値に減らすことは非常に難しいでしょう。しかし、すべてのNAudio APIでは、バッファサイズを指定できるため、ドロップアウトを取得する前にどれだけ低いレベルになるかを知ることができます。

関連する問題