2008-10-13 5 views
7

은 압축 된 형식 (MP3 또는 OGG와 같은)의 오디오 데이터를 포함하고 있으므로 입력의 WAV 변환을 포함하는 byte 배열을 만들려고합니다. 데이터. 아래 그림과 같이오디오 파일을 임시 파일없이 Java의 WAV 바이트 배열로 변환

java.io.IOException: stream length not specified 

나는 다시 그것을 읽은 후, 임시 파일에 WAV를 작성하여 작동하도록 얻을 관리 :이 작업을 수행하려고하면 불행하게도, JavaSound는 당신에게 다음과 같은 오류를 손

AudioInputStream source = AudioSystem.getAudioInputStream(new BufferedInputStream(in, 1024)); 
AudioInputStream pcm = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, source); 
AudioInputStream ulaw = AudioSystem.getAudioInputStream(AudioFormat.Encoding.ULAW, pcm); 
File tempFile = File.createTempFile("wav", "tmp"); 
AudioSystem.write(ulaw, AudioFileFormat.Type.WAVE, tempFile); 
// The fileToByteArray() method reads the file 
// into a byte array; omitted for brevity 
byte[] bytes = fileToByteArray(tempFile); 
tempFile.delete(); 
return bytes; 

이것은 분명히 바람직하지 않습니다. 더 좋은 방법이 있습니까?

답변

6

문제는 대부분의 AudioFileWriters가 OutputStream에 쓰는 경우 미리 파일 크기를 알아야한다는 것입니다. 이것을 제공 할 수 없기 때문에 항상 실패합니다. 불행히도 기본 자바 사운드 API 구현에는 대안이 없다.

하지만 당신은 (Tritonus 자바 사운드 API의 오픈 소스 구현)을 Tritonus 플러그인에서 AudioOutputStream 아키텍처를 사용하여 시도 할 수 있습니다 : http://tritonus.org/plugins.html

+1

나는 그것을 시도해야 할 것이다. 내가 그것을 시도하기 전에 그것은 조금일지도 모른다. 그래서 나는 대답을 지금 받아 들일 수 없다. 그래도 나는 그것을 upvote거야. –

-2

이 매우 간단합니다 ...

File f = new File(exportFileName+".tmp"); 
File f2 = new File(exportFileName); 
long l = f.length(); 
FileInputStream fi = new FileInputStream(f); 
AudioInputStream ai = new AudioInputStream(fi,mainFormat,l/4); 
AudioSystem.write(ai, Type.WAVE, f2); 
fi.close(); 
f.delete(); 

.tmp 파일은 RAW 오디오 파일이며 결과는 헤더가있는 WAV 파일입니다.

+1

임시 파일없이 * 할 수 있는지 묻습니다. –

1

나는 아주 오래전에 물어 보았다. 새로운 사용자 (Java 7 이상 사용)가이 스레드를 발견 한 경우 Files.readAllBytes API를 통해 더 나은 새로운 방법이 있음을 유의하십시오. 참조 : How to convert .wav file into byte array?

1

너무 오래되었지만, 필자는 이것이 필요했기 때문에이 주제에 대한 두 센트입니다.

-1

올바른 헤더를 만들 클래스를 준비하면 문제가 해결하기 쉽습니다. 내 예에서는 Example how to read audio input in wav buffer 데이터가 일부 버퍼에 저장되고, 그 다음에 헤더를 만들고 버퍼에 wav 파일이 있습니다. 추가 라이브러리가 필요 없습니다. 제 예제에서 코드를 복사하십시오. 버퍼 배열에 올바른 헤더를 생성 클래스를 사용하는 방법

예 :

public void run() {  
    try {  
     writer = new NewWaveWriter(44100); 

     byte[]buffer = new byte[256]; 
     int res = 0; 
     while((res = m_audioInputStream.read(buffer)) > 0) { 
      writer.write(buffer, 0, res); 
     } 
    } catch (IOException e) { 
     System.out.println("Error: " + e.getMessage()); 
    }  
}  

public byte[]getResult() throws IOException { 
    return writer.getByteBuffer(); 
} 

그리고 클래스 내 링크에서 찾을 수 있습니다 NewWaveWriter.

관련 문제