1

次の方法を使用して、バイト配列として保存されているサウンドを再生しようとしています。

byte[] clickSamples = getAudioFileData("sound.wav");
ByteBuffer buffer = ByteBuffer.allocate(bufferSize*2);
int tick = 0;

for (int i = 0; i < clickSamples.length; i++) {
    buffer.putShort((short) clickSamples[i]);
    tick++;
    if (tick >= bufferSize/SAMPLE_SIZE) {
        line.write(buffer.array(), 0, buffer.position());
        buffer.clear();
        tick = 0;
    }
}

何が問題なのかを説明するのはちょっと難しいです。音はしますが、「シュッ」というような音しか聞こえません。

アプリケーション全体がバイトバッファを中心に構築されているため、このメソッドをバイトバッファなどで使用したいと考えています。Clip または AudioInputStream を使用することは、実際にはオプションではありません。

だから私は私の質問は次のとおりだと思います:

バイトバッファを使用してバイト配列から直接サウンドを再生するにはどうすればよいですか?

ご協力ありがとうございました!

4

1 に答える 1

1

私はそれを機能させることができました。ここに私の新しいコードがあります:

    int tick = 0;
    for (int i = 0; i < clickSamples.length; i++) {
        tick++;
        if (tick >= bufferSize/SAMPLE_SIZE) {
            line.write(clickSamples, i-tick+1, tick);
            buffer.clear();
            tick = 0;
        }
    }

これは、AudioInputStream と同じようにサウンドを再生する複雑な方法のように思えるかもしれませんが、今では各 tick++ で計算を行うことができ、必要に応じて正確な時間に介入することができます。

これがばかげているように聞こえ、これを行う簡単な方法がある場合は、お知らせください。

また、非常に歪んで聞こえるのは、ByteBuffer がサンプル値を大幅に変更したように見えるためです。どういうわけか、私にはわかりません。知ってる人いたら教えてください!

ありがとうございました。:)

于 2013-01-07T01:51:31.980 に答える