Voglio creare un misuratore di livello audio in java per il microfono per verificare quanto è forte l'input. Dovrebbe assomigliare a quello del sistema operativo. Non sto chiedendo la gui. Si tratta solo di calcolare il livello di uscita audio del bytestream prodotto daCome calcolare il livello/ampiezza/db del segnale audio in java?
n = targetDataLine.read(tempBuffer , 0 , tempBuffer.length);
Così ho già qualcosa che è in esecuzione, ma non è nemmeno vicino alla levelmeter del mio sistema operativo (Windows) It stucks nel mezzo . Ho dei valori tra 0 e 100 che sono buoni, ma nel mezzo del volume spicca intorno al 60, non importa quanto sia forte l'input.
Ecco come ho calcolare subito:
amplitude = 0;
for (int j = 0; j < tempBuffer.length; j = j +2){
if (tempBuffer[j] > tempBuffer[j+1])
amplitude = amplitude + tempBuffer[j] - tempBuffer[j+1];
else amplitude = amplitude + tempBuffer[j + 1] - tempBuffer[j];
}
amplitude = amplitude/tempBuffer.length * 2;
C'è un/modo migliore più preciso per calcolare il livello audio per monitorare esso? O forse ho fatto un grave errore?
Questo è il mio Formato audio:
public static AudioFormat getAudioFormat(){
float sampleRate = 20000.0F;
//8000,11025,16000,22050,44100
int sampleSizeInBits = 16;
//8,16
int channels = 1;
//1,2
boolean signed = true;
//true,false
boolean bigEndian = false;
//true,false
return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, bigEndian);
//return new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 8000.0F, 8, 1, 1, 8000.0F, false);
}
Non capisco come si intende che il calcolo funzioni. (Stavi solo indovinando come decomprimere l'audio?) Cos'è il formato audio di TargetDataLine? – Radiodef
Ho esaminato la matrice di byte prodotta da n = targetDataLine.read (tempBuffer, 0, tempBuffer.length); e ho visto che si alterna tra valori bassi e alti, quindi ho pensato che fosse l'ampiezza. In realtà misuro veramente il livello di input ma funziona perché è proporzionale.L'unica cosa negativa è che nella gamma normale si discosta solo un po 'e non è così preciso come il livello di Windows dello stesso input. Forse qualcuno ha ulteriori consigli su come farlo? – AliceInChains