2014-03-30 15 views
1

AsioOut (NAudio)를 사용하여이 코드를 How to record and playback with NAudio using AsioOut대기 시간을 제거하고 반향하는 방법을 직접 모니터링 만든 날이 질문을 바탕으로

:

[DllImport("Kernel32.dll", EntryPoint = "RtlMoveMemory", SetLastError = false)] 
private static unsafe extern void MoveMemory(IntPtr dest, IntPtr src, int size); 

private void OnAudioAvailable(object sender, AsioAudioAvailableEventArgs e) 
{ 
    for (int i = 0; i < e.InputBuffers.Length; i++) 
    { 
      MoveMemory(e.OutputBuffers[i], e.InputBuffers[i], e.SamplesPerBuffer * e.InputBuffers.Length); 
    } 

    e.WrittenToOutputBuffers = true; 
} 

은 다음과 같이 수행이 느낌 비트 지연 시간 및 비트 에코과 나는 그들을 해결하는 방법을 모르겠다.

웹에서 에코 (AEC)를 제거 할 수있는 라이브러리를 검색했지만 C#에 유용한 것을 찾지 못했습니다. 아무도 나를 도울 줄 알아?

편집 1 : 내 AsioOut.PlaybackLatency은 2048ms입니다. 나는 헤드폰 시도하고 내가 에코 만 인해 마이크와 스피커 사이의 근접에 있음을 발견, 그래서 재미있을 것이지만 문제가되지 않습니다 : 그것은

편집 2 .. 조금 너무 높은입니다 AEC가있다.

문제가 해결되었습니다 : 지연 문제를 해결했습니다. 그것은 내 ASIO 드라이버의 문제, 나는 Cubase를 제거하고 ASIO4ALL 드라이버를 설치하고 지금은 잘 작동합니다. PS : MoveMemory의 마지막 매개 변수에 * 2을 추가해야했습니다. 왜 그런지는 모르겠지만 소리가 들리지 않으면 소리가 나옵니다.

답변

0

어떤 버퍼 크기를 사용하고 있습니까? 오디오를 녹음하고 재생하는 경우 모든 대기 시간을 제거하는 것은 완전히 불가능하다는 것을 기억하십시오. 대부분의 ASIO 드라이버는 매우 낮은 대기 시간 (10ms 미만)으로 진행할 수 있지만 사운드 카드의 직접 모니터링 기능이 꺼져 있거나 에코가 들리는 지 확인해야합니다.

+0

"버퍼 크기"는 'BufferedWaveProvider.BufferLength'를 의미합니까? 대답이 '예'이면 내 버퍼 크기 : 882000 – Shafa95

+0

아니요, ASIO 버퍼 크기를 의미하지 않습니다. 사운드 카드의 ASIO 제어판에 표시되어야합니다 –

+0

확인 _input_ 및 _ 출력 버퍼의 크기는 ** 2048 **이며 _Sync 참조는 _ 입력 _으로 설정됩니다. _audio buffer_의 크기가 정의되어 있지 않고 표준입니다 : 10ms .. 이 값을 변경하려고 시도했는데 대기 시간이 약간 짧았습니다. 지연 시간이 짧았습니다 ASIO (<10ms). 응용 프로그램에서는 처리 할 수 ​​없지만 ASIO 드라이버에서만 처리 할 수 ​​있습니다. 그러나 어쩌면 나는 이해하지 못했다. – Shafa95