2

バイト配列を AudioInputStream に変換したい。バイト配列は、以前に *.wav ファイルから入力されました。次のコードがあります。

    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

誰かがアイデアを持っていますか?

4

2 に答える 2

7

これを行う別の方法は、データが実際に 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
    );

また、バイトを音にする場合や、イヤホンが入っている場合は注意してください。

于 2016-05-12T08:08:27.277 に答える
1

WAV ファイルを適切に読み取ると、バイト配列には生の PCM データのみが含まれます。その結果、AudioSystem はストリームの形式を識別できず、例外がスローされます。

これは設計上機能しません。生データだけでなく、ストリームのフォーマットを AudioSystem に認識させるには、ストリームに完全なオーディオ フォーマット イメージを提供する必要があります。

于 2013-06-12T10:54:44.303 に答える