15

このメソッドを使用して、wav ファイルをバイト配列に読み込んでいます(以下を参照)。バイト配列内に格納したので、音量を変更したいと思います。

private byte[] getAudioFileData(final String filePath) {
    byte[] data = null;
    try {
    final ByteArrayOutputStream baout = new ByteArrayOutputStream();
    final File file = new File(filePath);
    final AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);

    byte[] buffer = new byte[4096];
    int c;
    while ((c = audioInputStream.read(buffer, 0, buffer.length)) != -1) {
        baout.write(buffer, 0, c);
    }
    audioInputStream.close();
    baout.close();
    data = baout.toByteArray();
    } catch (Exception e) {
    e.printStackTrace();
    }
    return data;
}

編集:オーディオ形式に関するいくつかの情報をリクエストするごとに:

PCM_SIGNED 44100.0 Hz、16 ビット、モノ、2 バイト/フレーム、リトルエンディアン

物理学の授業で、正弦値に 0 から 1 の間の数値を掛けることで、正弦波の振幅を変更できることを思い出しました。

編集: 16 ビット サンプルの更新されたコード:

private byte[] adjustVolume(byte[] audioSamples, double volume) {
    byte[] array = new byte[audioSamples.length];
    for (int i = 0; i < array.length; i+=2) {
        // convert byte pair to int
        int audioSample = (int) ((audioSamples[i+1] & 0xff) << 8) | (audioSamples[i] & 0xff);

        audioSample = (int) (audioSample * volume);

        // convert back
        array[i] = (byte) audioSample;
        array[i+1] = (byte) (audioSample >> 8);

    }
    return array;
}

audioSampleを掛けると音が大きく歪むvolume。そうしないと、両方の配列を比較するとArrays.compare(array, audioSample)、バイト配列が int に正しく変換され、逆に変換されていると結論付けることができます。

誰でも私を助けることができますか?ここで何が間違っていますか?ありがとうございました!:)

4

4 に答える 4

8

本当に 8 ビットのモノラル オーディオを読み込んでいますか? そうしないと、1 バイトが 1 サンプルに等しくならず、各バイトを単純にスケーリングすることはできません。たとえば、16 ビット データの場合は、バイトのすべてのペアを 16 ビット整数として解析し、それをスケーリングしてから、2 バイトとして書き戻す必要があります。

于 2013-01-23T17:45:28.307 に答える
1

1 バイトが 1 サンプルであると確信していますか? このフォーマット仕様では、サンプルが 2 バイトのように見えます。また、ヘッダーを変更しないようにすることを忘れないでください。

WAVE PCM サウンドファイル形式

于 2013-01-23T17:46:53.237 に答える