2013-05-16 5 views
0

나는 Java로 게임을 만들고있다. 약 100 개의 다른 샘플이 있고 특정 시간에 10 개의 샘플이 연주 될 수 있기를 바랍니다. 그러나이 10 개의 샘플 각각에 대해 볼륨과 팬을 조작 할 수 있기를 원합니다.Java에서 처리 할 수있는 오디오 클립의 수는 얼마입니까?

지금 현재, 나는 다음과 같이 라인 요청 : DataLine.Info(Clip.class, format);

나는이 라인에 필요한 컨트롤을 지정하지 않은 새를, 그러나 클립은 항상 MASTER_GAIN 및 밸런스 컨트롤이 나타납니다.

  1. 이 정보가 맞습니까?
  2. 방금 ​​100 개의 클립 배열을 만들고 모든 샘플을 미리로드 할 수 있습니까? Java의 라인이 실제 라인과 물리적 믹서 또는 가상화되어 있는지 잘 모르겠습니다.
  3. 제한적이라면 어떻게 샘플을 라인 안팎으로 바꿀 수 있습니까? 내 100 개의 샘플 모두가 미리로드되도록이 작업을 수행 할 수있는 방법이 있습니까? 또는 사전로드가 이미 지정된 경우에만 사전로드가 수행됩니까?
  4. 내가 제한적이라면 다시 말하지만 잘못된 접근입니까? 해야합니까? a. 다른 프로그래밍 언어를 사용하거나 b. 오디오 스트림을 수동으로 결합하고 모두 같은 라인을 통해 배치하십시오.

와우, 그게 많은 질문입니다. 나는 문서에서 답을 찾지 못했고, 정말로 너희들이 도울 수 있기를 바란다. 답을 1 ~ 4로 표시하십시오. 대단히 감사합니다!

+1

* "답변 번호를 1 ~ 4로 기입하십시오."* 4 가지 질문 (4 가지 개별 실)을 고려해보십시오. –

+0

* "Java에서 처리 할 수있는 오디오 클립의 수는 얼마입니까?"* 내 경험에 의하면 하드 및 빠른 규칙이 없음을 알 수 있습니다. 이는 JRE에 따라 다릅니다. –

답변

1

1) 항상 BALANCE 또는 MASTER_GAIN이 있다고 가정하는 것이 안전하다고 생각하지 않습니다. 어쩌면 있을지도 모른다. 오디오에 대한 Java Controls에 대한 나의 경험은 어리 석고 짧았습니다. 나는 내 자신의 믹서를 쓰기로 결정했고 그렇게했다. 나는이 코드를 기꺼이 공유 할 의향이있다. 여기에는 볼륨 및 패닝을 처리하기위한 기본 조항이 포함됩니다.

작동하는 경우에도 Java 컨트롤은 사용되는 버퍼 크기에 의해 제한되는 입도를 가지며, 페이드를 수행하려고 할 때 클릭을 만들지 않고 페이드 인 또는 페이드 아웃 할 수있는 속도를 심각하게 제한합니다. 단일 볼륨을 설정하고 유지하는 것은 문제가되지 않습니다.

또 다른 자바 라이브러리 (맨손이지만 뼈가 있지만 java-gaming.org에서 여러 게임 프로그래머가 심사)는 "ginyub"를 통해 사용할 수있는 "TinySound"입니다. 나는 그것을 살펴 봤지만 나 자신을 사용하지는 않았다. 또한 모든 사운드를 단일 출력 SourceDataLine에 믹싱합니다. 볼륨이나 패닝을 처리하는 방법을 기억하지 못합니다. 그는 ogg/vorbis 파일에 대한 조항을 포함 시켰습니다.

2) "샘플"을 언급 할 때 클립 작업을 어떻게 사용하는지 잘 모르겠습니다. 예, 100 개의 클립을 미리로드 할 수 있습니다. 그리고이 클립 중 하나 또는 다른 클립을 자체 스레드 (오디오 믹싱 라이브러리 대신 원시 Java를 사용한다고 가정)에서 직접 재생 한 다음 프레임 0으로 다시 설정 한 다음 다시 재생합니다. 그러나 한 번에 하나의 스레드 만 주어진 클립을 재생할 수 있습니다. 즉, 동시 재생을 수용하지 못합니다. (주어진 재생을 멈추고 위치를 프레임 # 0으로 다시 이동 한 다음 다시 재생하면 "다시 트리거"할 수 있습니다.)

클립의 지속 시간은 얼마입니까? 그 중 100 개는 많은 메모리가 될 수 있습니다. 각각 초당 길이라면 100 초 * 초당 44100 프레임 * 프레임 당 4 바이트 = 17640,000 바이트 (사운드 용 RAM은 거의 18MB!).

한 번에 몇 개만 필요하며 어떤 것이 필요할 지 예측할 수 있다면 미리로드하고 다시 사용할 수 있습니다. 그러나 클립이 재생 시점에로드 될 것이라는 생각의 함정에 빠지지 마십시오.이 작업을 수행하는 경우 SourceDataLines을 대신 사용해야합니다. 클립이하는 것처럼 전체 외부 파일이 메모리에 저장 될 때까지 기다릴 필요가 없으므로 재생이 더 빨리 시작됩니다. 0 번째 프레임으로 재설정하고 재생 (또는 반복)하려는 경우 클립 만 사용하는 것이 좋습니다!

3) 일단 클립으로로드되면 기본적으로 갈 준비가되어 있지만 실제로 추가 스테이지가 없습니다. 외부 파일과 내가 생각할 수있는 메모리 클립이 실제로 도움이 될 수있는 중간 단계는 없습니다.

아, 또 다른 생각 : 스레드 풀 (= 최대 동시 소리 수)을 만들어 관리하는 것이 좋습니다. 나는 스케일링이 어느 시점에서 여분의 관리를 정당화 하는지를 모른다.

4) 여러 개의 컨텍스트에서 동시 SourceDataLines을 실행할 수 있으므로 전체 파일을 RAM에 보관할 필요가 없습니다. 이 경우 미리로드 할 수있는 것은 파일 위치의 문자열뿐입니다. 내가 틀렸을 수도 있고 파일을 미리로드 할 수도 있지만 그렇지 않을 수도 있습니다. 확실히 AudioInputLine을 재사용 할 수 없습니다! 더하기 측면에서, SDL은 UNLOADED Clip에 비해 꽤 빨리 시작됩니다.

어쨌든! 단일 출력으로 제한하는 시스템 (예 : 일부 Linux OS)이 있으며,이 출력은 Clip 또는 SourceDataLine 중 하나 일 수 있습니다. 내 자신의 믹서를 만들기로 결정했을 때 그것은 나를위한 클린 처였습니다.

한 번에 8 또는 10 개의 톤 만 재생된다고 생각하면 그래픽이 너무 야심적이 아닌 한 (아마도 위에서 언급 한 Linux OS 상황을 고려하지 않음) 아마 괜찮을 것입니다. 테스트 해봐야 할 것입니다.

어떤 대체 언어를 고려하고 있는지 알 수 없습니다. 내가 아는 유일한 대안은 C의 맛입니다. Java를 제외하고 내가 아는 대부분의 것들은 저수준이 아니거나 그만큼의 오디오 프로세싱을 처리 할만큼 빠르지 않다. 그러나 나는 단지 겸손하게 경험했고, 건전한 엔지니어링 배경은 없지만 스스로 가르쳤다.

+0

대단히 감사합니다! 상황은 잘 진행되고 있으며 이는 매우 유익한 정보입니다. :디 –