このメソッドを使用して、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 に正しく変換され、逆に変換されていると結論付けることができます。
誰でも私を助けることができますか?ここで何が間違っていますか?ありがとうございました!:)