Я пытаюсь найти максимальный объем входа микрофона, потому что я пытаюсь найти, насколько громкий звук определен в среднем, поэтому моя программа может распознать его по объему. Метод расчета RMS с этого сайта (https://forums.oracle.com/forums/thread.jspa?threadID=1270831), я просто пытаюсь выяснить, как все работает ...Вычисление громкости микрофона (попытка найти максимум)
Проблема заключается в том, что независимо от того, сколько шума я делаю, уровень RMS выводится как 0 каждый раз ! Поэтому я либо установил, что my targetDataLine полностью ошибается, и не захватывает аудио ... или я сделал что-то неправильно в другом месте.
Вот то, что я до сих пор:
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.TargetDataLine;
public class MicrophoneTesting {
public MicrophoneTesting() {
// TODO Auto-generated constructor stub
}
protected static int calculateRMSLevel(byte[] audioData)
{ // audioData might be buffered data read from a data line
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 = sumMeanSquare + Math.pow(audioData[j] - dAvg, 2d);
double averageMeanSquare = sumMeanSquare/audioData.length;
return (int)(Math.pow(averageMeanSquare,0.5d) + 0.5);
}
public static void main(String[] args){
// Open a TargetDataLine for getting microphone input & sound level
TargetDataLine line = null;
AudioFormat format = new AudioFormat(8000, 0, 1, true, true);
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); // format is an AudioFormat object
if (!AudioSystem.isLineSupported(info)) {
System.out.println("The line is not supported.");
}
// Obtain and open the line.
try {
line = (TargetDataLine) AudioSystem.getLine(info);
line.open(format);
} catch (LineUnavailableException ex) {
System.out.println("The TargetDataLine is Unavailable.");
}
Timer t = new Timer(); // I used a timer here, code is below
while(t.seconds < 2){
byte[] bytes = new byte[line.getBufferSize()/5];
line.read(bytes, 0, bytes.length);
System.out.println("RMS Level: " + calculateRMSLevel(bytes));
}
}
}
Таймер Код:
public class Timer implements Runnable{
int seconds;
Thread t;
public Timer() {
this.seconds = 0;
t = new Thread(this, "Clap Timer");
t.start(); // Start the thread
}
@Override
public void run() {
// TODO Auto-generated method stub
while(seconds < 2)
{
//Wait 1 second
try {
Thread.sleep(1000);
}
catch(Exception e) {
System.out.println("Waiting interupted.");
}
seconds++;
}
}
}
@ user2247192 Это нормально, чтобы ответить на ваш собственный вопрос, но вы должны написать его в правильном формате ответа, как будто вы ответили бы на вопрос кого-то другого. Выходите из таких вещей, как «глупая ошибка!» и указать, где эта строка должна быть добавлена (после 'line.open()'?), и предпочтительно также, почему это необходимо (ну, в этом случае это может быть очевидно). Тогда это хороший ответ, и вы можете вернуться и принять его позже. – hyde
Имейте в виду ... Я добавил «line.start()» чуть ниже line.open() – Riptyde4