Как получить значение громкости входа микрофона с помощью веб-аудио api?

Я использую микрофонный вход с веб-аудио api и вам нужно получить значение объема.

Сейчас у меня уже есть микрофон для работы: http://updates.html5rocks.com/2012/09/Live-Web-Audio-Input-Enabled

Кроме того, я знаю, что существует метод, управляющий объемом аудиофайла: http://www.html5rocks.com/en/tutorials/webaudio/intro/

    // Create a gain node.
    var gainNode = context.createGain();
    // Connect the source to the gain node.
    source.connect(gainNode);
    // Connect the gain node to the destination.
    gainNode.connect(context.destination);
   // Reduce the volume.
   gainNode.gain.value = 0.5;

Но как объединить эти два и получить значение входного объема? Мне просто нужно значение, нет необходимости манипулировать им.

Кто-нибудь знает?

Ответы

Ответ 1

Есть две основные причины, по которым нужно получить "объем": 1) обнаруживают, когда источник "зажимает", то есть абсолютное значение сигнала проходит на заданном уровне, обычно очень близком к 1.0, где он начнет отсекать. 2) дать пользователю почувствовать, насколько громко их сигнал.

Причина, по которой я перечисляю их отдельно, состоит в том, что сначала требуется, чтобы вы обрабатывали каждый образец, потому что в противном случае вы могли бы пропустить короткий переходный период. Для этого вам нужно будет использовать ScriptProcessor node, и вам придется перебирать каждый образец в буфере внутри onaudioprocess, чтобы искать абсолютные значения выше уровня вашего клипа. Тогда вы могли бы просто определить уровень RMS - просто суммируйте квадраты каждого образца, разделите на N и возьмите квадратный корень. НЕ обрабатывайте изнутри onaudioprocess, хотя - задайте значения, которые вы получаете по запросуAnimationFrame.

Вы также можете использовать AnalyserNode для определения уровня и просто усреднить данные, вроде того, что приведенный выше ответ в getAverageVolume. Однако вышеприведенный ответ НЕ является хорошим использованием ScriptProcessor - на самом деле он вообще не обрабатывает script node, даже не передавая данные, просто используя его, как обратный вызов таймера. Вы были бы лучше, если бы использовались requestAnimationFrame в качестве визуального обратного вызова; никогда не устанавливайте макеты или визуальные параметры изнутри onaudioprocess, как это, или вы попрошайки трясти свою аудиосистему. Если вам не требуется обнаружение клипов, просто сделайте getByteFrequencyCount/getAverageVolume сверху на AnalyserNode (но вы должны свести к минимуму количество групп в Анализаторе - 64 - это минимум, я думаю), и вы должны предварительно распределить и повторно использовать Uint8Array, а не выделять его каждый раз (что будет усиливать сбор мусора).

Ответ 2

Я сделал громкость для воспроизведения звука, когда я изучал HTML 5.

Я следил за этим замечательным учебником

http://www.smartjava.org/content/exploring-html5-web-audio-visualizing-sound

 // setup a analyzer
 analyser = context.createAnalyser();
 analyser.smoothingTimeConstant = 0.3;
 analyser.fftSize = 1024;

 javascriptNode = context.createScriptProcessor(2048, 1, 1);


 javascriptNode.onaudioprocess = function() {

        // get the average, bincount is fftsize / 2
        var array =  new Uint8Array(analyser.frequencyBinCount);
        analyser.getByteFrequencyData(array);
        var average = getAverageVolume(array)

         console.log('VOLUME:' + average); //here the volume
 }

 function getAverageVolume(array) {
        var values = 0;
        var average;

        var length = array.length;

        // get all the frequency amplitudes
        for (var i = 0; i < length; i++) {
            values += array[i];
        }

        average = values / length;
        return average;
  }

ПРИМЕЧАНИЕ: я просто не знаю, будет ли он работать на аудиовход, поступающий с микрофона