Sto leggendo un file wav su un array di byte utilizzando this method (shown below). Ora che lo ho memorizzato all'interno del mio array di byte, voglio cambiare il volume dei suoni.Audio: modifica del volume dei campioni nell'array di byte
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;
}
Edit: Per richiesta di alcune informazioni sul formato audio:
PCM_SIGNED 44100,0 Hz, 16 bit, mono, 2 byte/telaio, little-endian
Da classe fisica Ho ricordato che è possibile modificare l'ampiezza di un'onda sinusoidale moltiplicando il valore seno con un numero compreso tra 0 e 1.
Edit: codice aggiornato per i campioni a 16 bit:
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;
}
Il suono è fortemente distorto se moltiplico audioSample
con volume
. Se non lo faccio e confronti entrambi gli array con Arrays.compare(array, audioSample)
, posso concludere che l'array di byte viene convertito correttamente in int e viceversa.
Qualcuno può aiutarmi? Cosa sto sbagliando qui? Grazie! :)
Si potrebbe ottenere risposte migliori su DSP .stackexchange.com – egrunin
1) Per un aiuto migliore, pubblicare un [SSCCE] (http://sscce.org/). 2) Segnala 'audioInputStream.getFormat()'. –
@egrunin Grazie! Posso semplicemente copiarlo e incollarlo lì o quali sono le regole per spostare gli argomenti? – Macks