2013-06-12 3 views
1

바이트 배열을 AudioInputStream으로 변환하려고합니다. 이전에는 * .wav 파일에서 바이트 배열을 채 웠습니다. 나는 다음과 같은 코드가 있습니다바이트 배열을 Java의 AudioInputStream으로 변환하는 방법

public static AudioInputStream writeBytesBackToStream(byte[] bytes) { 
    ByteArrayInputStream baiut = new ByteArrayInputStream(bytes); 
    AudioInputStream stream = null; 
    try { 
     stream = AudioSystem.getAudioInputStream(baiut); 
    } catch (UnsupportedAudioFileException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    if(stream.equals(null) || stream == null) { 
     System.out.println("WARNING: Stream read by byte array is null!"); 
    } 
    return stream; 
} 

가 지금은 단지 AudioInputStream를에이 바이트 배열을 변환 할을하지만, UnsupportedAudioFileException가 발생합니다 :

javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input stream 

사람이 생각이있어나요?

+0

사용 [이] (http://docs.oracle.com/javase/1.5.0/docs/ api/javax/sound/sampled/AudioSystem.html # isFileTypeSupported (javax.sound.sampled.AudioFileFormat.Type)). wav 파일을 지원하는지 확인하고 wav 파일을 getAudioInputStream에 전달하여 테스트 할 수 있습니다. 문제가 bytearray 또는 파일 자체 인 경우 – fmodos

+0

바이트 배열이 올바른지 확인하기 위해 wav 파일 로딩 코드를 게시 할 수 있습니까? – gma

+0

Durandel의 대답은 정확하다고 생각하지만이 입문서를 읽는 것이 도움이 될 수 있습니다. http://blog.bjornroche.com/2013/05/the-abcs-of-pcm-uncompressed-digital.html –

답변

1

WAV 파일을 올바르게 읽으면 바이트 배열에는 원시 PCM 데이터 만 포함됩니다. 결과적으로, AudioSystem는 스트림의 형식을 식별 할 수 없기 때문에 예외를 Throw합니다.

이것은 의도적으로 작동하지 않을 수 있습니다. AudioSystem에서 원시 데이터가 아닌 스트림의 형식을 인식하도록하려면 스트림에 완전한 오디오 형식 이미지를 제공해야합니다.

+0

감사합니다 .wav 헤더가 해결책입니다. 헤더 없이도 AudioInputStream을 매번 사용할 수 있다고 생각했습니다. –

+0

@Kosch 만약 당신이 그것에 관해 조금이라도 생각한다면 그것은 구현하는 것이 불가능할 것입니다. getAudioInputStream()은 모노/스테레오, 샘플 당 바이트 수, 바이트 순서 및 원시 데이터 만 샘플링하는 방법을 결정합니까? – Durandal

2

데이터를 실제로 PCM 경우 다른 방법은 AudioFormat 매개 변수를 수동으로 설정하는 것입니다. 다음은 A 미성년자를 생성하는 예제입니다. 또한

byte[] b = new byte[64000]; 
    //lets make a 440hz tone for 1s at 32kbps, and 523.25hz. 
    for(int i = 0; i<b.length/2; i++){ 

     b[i*2+1] = (byte)(127*Math.sin(4*Math.PI*440.0/b.length*i)); 
     b[i*2] = (byte)(127*Math.sin(4*Math.PI*523.25/b.length*i)); 
    } 

    AudioInputStream stream = new AudioInputStream(
     new ByteArrayInputStream(b), 
     new AudioFormat(16000, 8, 2, true, false), 
     64000 
    ); 

당신이 소리에 바이트를 제작하는 경우주의해야하고 당신이 이어폰을 가지고있다.

관련 문제