Livello del microfono in Java

Sto cercando di accedere al livello del microfono tramite Java. Non ho bisogno di registrare nulla, voglio solo sapere una scala relativa del livello sonoro.

È ansible in tempo reale?

Se è imansible, forse potrebbe funzionare: Inizia la registrazione quando il livello supera un certo valore, fermati quando il livello scende sotto un certo livello per un certo tempo. Registra bit di un quarto di secondo e leggendo il suo volume e se è sotto la soglia interrompere la registrazione.

Grazie in anticipo

    Puoi accedere ai microfoni tramite l’API Sound, ma non ti darà un livello di loudness semplice. Dovrai solo acquisire i dati e prendere la tua decisione su quanto è forte.

    http://download.oracle.com/javase/tutorial/sound/capturing.html

    La registrazione implica il salvataggio dei dati, ma qui puoi scartare i dati una volta che hai finito di determinarne il volume.

    Il metodo quadratico medio è un buon modo per calcolare l’ampiezza di una sezione di dati d’onda.

    In risposta al tuo commento, sì, dovresti acquisire una breve quantità di dati (forse solo qualche millisecondo) e calcolare l’ampiezza di quello. Ripeti periodicamente a seconda della frequenza con cui hai bisogno di aggiornamenti. Se vuoi tenere traccia dei rumori precedenti e confrontarli, dipende da te: a questo punto si tratta solo di confrontare i numeri. È ansible utilizzare la media dei loudness recenti per calcolare il volume ambientale della stanza, in modo da poter rilevare improvvisi aumenti di rumore.

    Non so quanta overhead ci sia nel far accendere e spegnere l’acquisizione audio, ma potrebbe essere meglio mantenere TargetDataLine aperto il TargetDataLine e calcolare il volume quando ne hai bisogno. Mentre la linea è aperta, è necessario continuare a chiamare read (), altrimenti l’applicazione si bloccherà aspettando la lettura dei dati.

    http://www.technogumbo.com/tutorials/Java-Microphone-Selection-And-Level-Monitoring/Java-Microphone-Selection-And-Level-Monitoring.php

    Abbastanza buono articolo su questo. Mi ha aiutato molto

    Da quello che posso dire, questo usa la roba quadratica media di cui si parla nella risposta di @ Nick

    Fondamentalmente:

     public int calculateRMSLevel(byte[] audioData) { long lSum = 0; for(int i=0; i < audioData.length; i++) lSum = lSum + audioData[i]; double dAvg = lSum / audioData.length; double sumMeanSquare = 0d; for(int j=0; j < audioData.length; j++) sumMeanSquare += Math.pow(audioData[j] - dAvg, 2d); double averageMeanSquare = sumMeanSquare / audioData.length; return (int)(Math.pow(averageMeanSquare,0.5d) + 0.5); } 

    e l'uso:

     int level = 0; byte tempBuffer[] = new byte[6000]; stopCapture = false; try { while (!stopCapture) { if (targetRecordLine.read(tempBuffer, 0, tempBuffer.length) > 0) { level = calculateRMSLevel(tempBuffer); } } targetRecordLine.close(); } catch (Exception e) { System.out.println(e); System.exit(0); }