我正在尝试找到麦克风输入的最大音量,因为我试图找到平均声音有多大,所以我的程序可以按音量识别它。 RMS计算方法来自这个网站(https://forums.oracle.com/forums/thread.jspa?threadID=1270831),我只想弄清楚一切是如何运作的......
问题在于,无论我发出多少噪音,每次都会将RMS电平输出为0!所以我要么将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++;
}
}
}
答案 0 :(得分:0)
我在line.start()
之后添加line.open()
时就有效了。