2008-11-08 6 views
1

JavaSound API를 사용하여 오디오 파일을 읽고 쓰는 오디오 필터를 만들려고합니다.JavaSound 스트림을 사용하여 오디오 파일에 쓰기

 ByteArrayOutputStream b_out = new ByteArrayOutputStream(); 

     // Read a frame from the file. 
     while (audioInputStream.read(audioBytes) != -1) { 
      //Do stuff here.... 
      b_out.write(outputvalue); 
     } 

     // Hook output stream to output file 
     ByteArrayInputStream b_in = new ByteArrayInputStream(b_out.toByteArray()); 
     AudioInputStream  ais = new AudioInputStream(b_in, format, length); 
     AudioSystem.write(ais, inFileFormat.getType(), outputFile); 

이것은, 스트림으로 입력 파일을 읽고 그것을 처리하고있는 ByteArrayOutputStream에 기록하지만, 전체 파일을 디스크에 쓰기 전에 처리 된 때까지 기다립니다 다음과 같이 현재 내 코드가 구성되어있다. 이상적으로는 각 샘플을 처리 할 때마다 디스크에 기록하는 것이 좋습니다. 여러 조합의 스트림 구조를 시도했지만 AudioSystem.write()가 입력 스트림을 취할 때이를 수행하는 방법을 찾을 수 없습니다. 어떤 아이디어?

답변

1

일부 오디오 형식에서는 헤더의 스트림 길이 (또는 청크 수)를 설명하는 메타 데이터가 필요하므로 전체 데이터 집합이 나타나기 전에 데이터 쓰기를 시작할 수 없습니다. Java 사운드 API가 동일한 API로 모든 형식을 처리 할 수 ​​있도록하려면 이러한 제한을 의도적으로 부과해야한다고 생각합니다.

그러나 쉽게 스트리밍 할 수있는 오디오 포맷이 많이 있습니다. 그들 중 많은 사람들이 자바에 대한 오픈 라이브러리 구현을 가지고 있기 때문에, 외부 라이브러리를 추가하고자한다면 그렇게하기가 어렵지 않을 것이다.

2

kasperjj 님의 답변이 맞습니다. WAV 파일로 작업하고 있습니다. 웨이브 파일의 레이아웃은 this 입니다. 전체 WAV 파일의 크기는 헤더에 인코딩되어 있습니다.

귀하의 경우에 해당되는지는 잘 모르겠지만 설명 된대로 WAV 샘플을 처리하려면 "일반"비 오디오 Java 출력 스트림을 사용할 수 있습니다. 예를 들어 FileOutputStream을 사용하여 임시 파일에 파일을 쓸 수 있으며 처리 후 임시 파일을 유효한 WAV 파일로 변환 할 수 있습니다.

0

AudioSystem.write 메서드를 다시 구현하면이 문제를 해결할 수 있습니다. 스트림 및 WAVE 형식에서는 작동하지 않습니다. AudioInputStream에서 데이터를 읽어 바이트 배열로 캐시하고 배열을 처리하고 웨이브 파일에 기록해야합니다. 이 예에서 수업을 확인하는 것이 좋습니다. How to record audio to byte array