문제

내가하고 싶은 일은 다음과 같습니다.

사용자가 내 프로그램에 사운드 데이터 (마이크 입력을 통해)를 제공 한 다음 250ms에 적합한 다음 스피커를 통해 다시 출력 할 수 있도록하고 싶습니다.

나는 이미 Java Sound API를 사용 하여이 작업을 수행했습니다. 문제는 일종의 느린다는 것입니다. 사운드가 만들어지는 시간부터 스피커에서 소리가 다시 들리는 시간까지 최소 약 1-2 초가 걸리며 아직 지연 논리를 구현하려고 시도하지 않았습니다. 이론적으로 지체가 없어야하지만 있습니다. 사운드 카드가 버퍼 또는 무엇이든 채워질 때까지 기다려야한다는 것을 이해하며 샘플 크기와 샘플링 속도는 이것과 관련이 있습니다.

내 질문은 이것입니다.이 작업을 수행하려고 하바 경로를 계속해야합니까? 가능하면 100ms와 같은 지연을 내고 싶습니다. 누구든지 Java와 함께 ASIO 드라이버를 사용한 경험이 있습니까? 아마도 더 빨라 ..

또한, 나는 .net 남자입니다. 대신 .NET과 관련이 있습니까? C ++는 어떻습니까? 여기에서 사용할 올바른 기술을 찾고 있으며 제안 된 기술 플랫폼을 사용하여 오디오 입력/출력 스트림을 읽고 쓰는 방법에 대한 좋은 예일 것입니다. 당신의 도움을 주셔서 감사합니다!

도움이 되었습니까?

해결책

나는 과거에 Javasound를 사용했고 놀랍도록 벗겨 졌다는 것을 알았습니다 (그리고 VM 릴리스 사이에서 계속 변화하고 있습니다). C#을 좋아하는 경우 사용하여 DirectX API를 사용하십시오. 다음은 DirectSound 및 C#을 사용하여하고 싶은 일을하는 예입니다. 효과 플러그인을 사용하여 250ms 에코를 수행 할 수 있습니다.

http://blogs.microsoft.co.il/blogs/tamir/archive/2008/12/25/capturing-and-streaming-sound-using-directsound-with-c.aspx

다른 팁

당신은 조사하고 싶을 수도 있습니다 , 저도가 낮은 사운드 처리를 위해 설계된 오디오 API. 또한 Google이이를 나타냅니다 멋진 프레젠테이션 PDF] Java와 함께 Jack을 사용하는 것에 대한 [PDF].

이론적으로 지체가 없어야하지만 있습니다.

글쎄, 지연이없는 것은 불가능합니다. 당신이 기대할 수있는 최선은 눈에 띄지 않는 지연입니다 (인간의 인식 측면에서). 사운드 데이터를 읽고 쓰기위한 기본 알고리즘을 설명하면 사람들이 가능한 문제를 식별 할 수 있습니다.

Java와 같은 쓰레기 수집 언어를 사용하는 데있어 잠재적 인 문제는 GC가 주기적으로 실행되어 임의의 시간 동안 처리를 방해한다는 것입니다. 그러나 정상적인 사용이> 100ms라면 놀랄 것입니다. GC가 문제가되는 경우 대부분의 JVM은 시도 할 수있는 대체 수집 알고리즘을 제공합니다.

C/C ++ 경로를 내려 가려면 Portaudio를 사용하는 것이 좋습니다. http://portaudio.com/ ). 그것은 여러 플랫폼에서 거의 모든 것과 함께 작동하며 실제로 주변의 다양한 사운드 드라이버 기술을 다루지 않고도 사운드 드라이버의 저수준 제어 기능을 제공합니다.

나는 여러 프로젝트에서 Portaudio를 사용했으며 사용하는 것은 정말 기쁨입니다. 그리고 라이센스는 허용됩니다.

낮은 대기 시간이 목표라면 C를 이길 수 없습니다.

libsoundio 실시간 오디오 입력 및 출력을위한 저수준 C 라이브러리입니다. 심지어는 함께 제공됩니다 예제 프로그램 마이크 입력을 스피커 출력에 파이핑하는 것은 정확히 당신이 원하는 것을 수행합니다.

확실히 달성 할 수 있습니다 Javasound 100-150ms의 야구장에서 끝까지 대기 시간을 얻습니다.

  1. 대기 시간의 주요 원인은 캡처 및 재생 라인의 버퍼 크기입니다. 선을 열 때 크기가 설정됩니다.

    • 포착: TargetDataLine#open(AudioFormat format, int bufferSize)
    • 재생 : SourceDataLine#open(AudioFormat format, int bufferSize)

버퍼가 너무 커지면 초과 대기 시간이 발생하지만 너무 작 으면 끊임없는 재생이 발생합니다. 따라서 응용 프로그램 요구와 컴퓨팅 성능에 대한 잔액을 찾아야합니다.

기본 버퍼 크기를 확인할 수 있습니다 DataLine#getBufferSize 전화 할 때 #open(AudioFormat format). 기본 크기는 AudioFormat 대기 시간이 높고 말더 핑 프리 재생 응용 프로그램 (예 : 인터넷 스트리밍)을 위해 준비된 것 같습니다. 낮은 대기 시간 응용 프로그램을 개발하는 경우 기본 버퍼 크기가 너무 커서 변경해야합니다.

16 비트 PCM으로 테스트에서 AudioFormat, 1024 바이트의 버퍼 크기는 낮은 대기 시간에 이상적이었습니다.

  1. 오디오 대기 시간의 두 번째로 간과되는 원인은 캡처 또는 재생 스레드에서 수행되는 다른 활동입니다. 예를 들어, 콘솔에 메시지 로깅을하면 MS의 MS 10 대를 소개 할 수 있습니다. 끄십시오.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top