2
我试图找到麦克风输入的最大音量,因为我试图找出平均声音有多大,所以我的程序可以通过音量识别它。有效值的计算方法是从这个网站(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++;
}
}
}
@ user2247192可以回答你自己的问题,但你应该用正确的答案格式来写,就像你回答其他人的问题一样。留下诸如“愚蠢的错误!”之类的东西并告诉应该在哪里添加该行(在'line.open()'?之后),并且最好也是为什么需要它(在这种情况下,它可能很明显)。那么这是一个很好的答案,您可以稍后再回来接受它。 – hyde 2013-04-08 07:05:18
请注意......我在line.open()的下方添加了“line.start()” – Riptyde4 2013-04-08 21:34:48