2017-10-21 23 views
0

C# WPF를 사용하여 실시간 FFT를 만들고 있습니다.오디오 재생을 지연하여 FFT와 동기화하는 방법

저는 NAudio의 WaveIn과 BufferedWaveProvider를 사용하여 Stereo Mix로 녹음 된 사운드를 캡처하고 있습니다. 필자는 초당 여러 번 버퍼의 FFT를 사용하여 비트 맵을 사용하여 디스플레이하여 스피커를 통해 재생되는 오디오의 실시간 푸리에 변환을 보여줍니다.

내 문제는 예상대로 표시된 FFT가 스피커에서 나오는 오디오보다 약간 뒤떨어져있는 것입니다 (아마도 200 밀리 초).

스피커에서 재생할 현재 오디오를 녹음 할 수있는 방법이 있습니까? 그렇기 때문에 FFT를 수행 한 다음 나중에 작은 시간 (예 : 200ms) 재생할 수 있습니다. 원래의 실시간 오디오를 음소거합니다.

최종 결과는 단순히 표시된 FFT에서 감지 된 지연을 효과적으로 제거하는 것입니다. 예를 들어, YouTube 비디오의 오디오는 프로그램이 실행되는 동안 비디오 뒤에서 약간 뒤떨어집니다. 여기

내가 지금 무슨에서 관련 방법은 다음과 같습니다

public MainWindow() 
    { 
     sampleSize = (int)Math.Pow(2, 13); 
     BUFFERSIZE = sampleSize * 2; 

     InitializeComponent(); 

     // get the WaveIn class started 
     WaveIn wi = new WaveIn(); 
     wi.DeviceNumber = deviceNo; 
     wi.WaveFormat = new NAudio.Wave.WaveFormat(RATE, WaveIn.GetCapabilities(wi.DeviceNumber).Channels); 

     // create a wave buffer and start the recording 
     wi.DataAvailable += new EventHandler<WaveInEventArgs>(wi_DataAvailable); 
     bwp = new BufferedWaveProvider(wi.WaveFormat); 

     bwp.BufferLength = BUFFERSIZE; //each sample is 2 bytes 
     bwp.DiscardOnBufferOverflow = true; 
     wi.StartRecording(); 
    } 

    public void UpdateFFT() 
    { 
     // read the bytes from the stream    
     byte[] buffer = new byte[BUFFERSIZE]; 
     bwp.Read(buffer, 0, BUFFERSIZE); 
     if (buffer[BUFFERSIZE - 2] == 0) return; 

     Int32[] vals = new Int32[sampleSize]; 
     Ys = new double[sampleSize]; 
     for (int i = 0; i < vals.Length; i++) 
     { 
      // bit shift the byte buffer into the right variable format 
      byte hByte = buffer[i * 2 + 1]; 
      byte lByte = buffer[i * 2 + 0]; 
      vals[i] = (short)((hByte << 8) | lByte); 
      Ys[i] = vals[i]; 
     } 

      FFT(Ys); 
    } 

나는 오디오 프로세싱에 새로운 여전히 오전 - 어떤 도움을 주시면 감사하겠습니다.

+0

WriteableBitmap을 사용하고 있습니까? – Clemens

+0

@Clemens 예, 필자는 WriteableBitmapEx 패키지를 설치했습니다. –

답변

0

지연의 원인은 지연 시간이 WaveIn이며, 기본값은 약 200ms입니다. 그것을 줄일 수는 있지만 탈락의 위험이 있습니다.

WasapiCapture으로 시스템에서 재생되는 오디오를 캡처 할 수 있지만 NAudio를 사용하여 오디오를 변경하거나 재생을 지연시킬 수있는 방법은 없습니다.

+0

답변 마크를 보내 주셔서 감사합니다. 이 질문에 여러 번 대답 하셨겠지만 WaveIn의 대기 시간을 줄이려면 어떻게해야합니까? 나는 WaveIn의 속성을 보지 못합니다. –

+0

'BufferMilliseconds'를 더 낮은 값으로 설정하십시오. –