Уровень микрофона в Java - PullRequest
4 голосов
/ 10 октября 2010

Я пытаюсь получить доступ к уровню микрофона через Java. Мне не нужно ничего записывать, я просто хочу знать относительную шкалу уровня звука.

Возможно ли это в режиме реального времени?

Если это невозможно, возможно, это может сработать: Начать запись, когда уровень превысит определенное значение, остановить, когда уровень упадет ниже определенного уровня в течение определенного времени Запись бит четверти секунды и считывание его громкости, и если он ниже порога, прекратите запись.

Заранее спасибо

Ответы [ 2 ]

6 голосов
/ 17 сентября 2015

http://www.technogumbo.com/tutorials/Java-Microphone-Selection-And-Level-Monitoring/Java-Microphone-Selection-And-Level-Monitoring.php

Довольно хорошая статья на эту тему. Мне очень помогли.

Из того, что я могу сказать, здесь используется материал среднего квадрата, о котором говорилось в ответе @ Ника

В основном:

public int calculateRMSLevel(byte[] audioData)
{ 
    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 += Math.pow(audioData[j] - dAvg, 2d);

    double averageMeanSquare = sumMeanSquare / audioData.length;

    return (int)(Math.pow(averageMeanSquare,0.5d) + 0.5);
}

и использование:

int level = 0;
byte tempBuffer[] = new byte[6000];
stopCapture = false;
try {
    while (!stopCapture) {
        if (targetRecordLine.read(tempBuffer, 0, tempBuffer.length) > 0) {
            level = calculateRMSLevel(tempBuffer);
        }
    }
    targetRecordLine.close();
} catch (Exception e) {
    System.out.println(e);
    System.exit(0);
}
4 голосов
/ 10 октября 2010

Вы можете получить доступ к микрофонам через Sound API, но это не даст вам простой уровень громкости.Вам просто нужно захватить данные и принять собственное решение о том, насколько они громкие.

http://download.oracle.com/javase/tutorial/sound/capturing.html

Запись подразумевает сохранение данных, но здесь вы можете отказаться от данных, как только выВы закончили определение его громкости.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.да, вы бы захватили небольшую длину данных (может быть, всего несколько миллисекунд) и вычислили бы их амплитуду.Периодически повторяйте это в зависимости от того, как часто вам нужны обновления.Если вы хотите отслеживать предыдущие громкости и сравнивать их, это ваше дело - на данный момент это просто сравнение чисел.Вы можете использовать среднее значение недавних громкостей для расчета громкости в комнате, чтобы вы могли обнаружить внезапное увеличение шума.

Я не знаю, сколько накладных расходов при включении и выключении захвата звука,но вам может быть лучше держать TargetDataLine открытым все время и просто вычислять громкость, когда вам это нужно.Пока строка открыта, вам нужно продолжать вызывать read (), в противном случае приложение будет зависать, ожидая, пока вы прочитаете данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...