2013-04-08 43 views
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++; 
    } 
} 
} 

回答

0

它工作时,我在line.start()添加line.open()后。

+0

@ user2247192可以回答你自己的问题,但你应该用正确的答案格式来写,就像你回答其他人的问题一样。留下诸如“愚蠢的错误!”之类的东西并告诉应该在哪里添加该行(在'line.open()'?之后),并且最好也是为什么需要它(在这种情况下,它可能很明显)。那么这是一个很好的答案,您可以稍后再回来接受它。 – hyde 2013-04-08 07:05:18

+0

请注意......我在line.open()的下方添加了“line.start()” – Riptyde4 2013-04-08 21:34:48