2013-04-08 3 views
2

Я пытаюсь найти максимальный объем входа микрофона, потому что я пытаюсь найти, насколько громкий звук определен в среднем, поэтому моя программа может распознать его по объему. Метод расчета 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++; 
    } 
} 
} 

ответ

0

Он работал, когда я добавил в line.start() после line.open().

+0

@ user2247192 Это нормально, чтобы ответить на ваш собственный вопрос, но вы должны написать его в правильном формате ответа, как будто вы ответили бы на вопрос кого-то другого. Выходите из таких вещей, как «глупая ошибка!» и указать, где эта строка должна быть добавлена ​​(после 'line.open()'?), и предпочтительно также, почему это необходимо (ну, в этом случае это может быть очевидно). Тогда это хороший ответ, и вы можете вернуться и принять его позже. – hyde

+0

Имейте в виду ... Я добавил «line.start()» чуть ниже line.open() – Riptyde4

 Смежные вопросы

  • Нет связанных вопросов^_^