2016-09-12 7 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의 Listen 기능을 사용하여 위의 작업을 시도하면 완벽하게 작동합니다. 저에 따르면 그것은 쓰기 버퍼 읽기 문제 일 수 있습니다. 그것을하는 법을 모르십시오 ...

+0

고대 API를 사용하고 있습니다. WasapiCapture/WasapiOut (Vista 이상)을 사용해보십시오. 또한 지연을 피하기 위해 낮은 버퍼 크기를 설정하십시오. – apocalypse

+0

낮은 버퍼 크기를 설정하는 방법 .. –

+0

WasapiOut 생성자에서. 이것은 '대기 시간'(milliseconds)이라고합니다. – apocalypse

답변

0

지연은 여기에서 문제점입니다. 녹음 및 재생 단계에는 대기 시간이 있습니다. ASIO와 같은 것을 사용하지 않으면이 값을 작은 값으로 줄이는 것이 매우 어렵습니다. 그러나 모든 NAudio API를 사용하면 버퍼 크기를 지정할 수 있으므로 드롭 아웃이 발생하기 전에 얼마나 낮은 상태인지 확인할 수 있습니다.

관련 문제