2015-07-22 1 views
0

Я использовал веб-аудио api для подключения микрофона к свертильному аппарату к анализатору к графику gui для построения спектра. Для тестирования я устанавливал буфер свертки в единицу, но я не получаю никакого вывода. Если я обойду сокрушитель и подключу микрофон непосредственно к анализатору, он работает. Не могли бы вы помочь?web audio api convolver does't, похоже, выводит нули

В приведенном ниже коде use_convolver определяет, следует ли обходить свертыватель или нет.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 

    <head> 
     <meta charset="utf-8"> 

     <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> 
     <script src="http://www.flotcharts.org/flot/jquery.flot.js" type="text/javascript"></script> 
    </head> 

    <body> 
     <h1>Audio Spectrum</h1> 
     <div id="placeholder" style="width:400px; height:200px; display: inline-block;"> 

     </div> 
     <script> 
      var microphone; 
      var analyser; 
      var convolver; 
      //user media 
      navigator.getUserMedia = (navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia); 
      if (navigator.getUserMedia) { 
       console.log('getUserMedia supported.'); 
       navigator.getUserMedia(
       // constraints - only audio needed for this app 
       { 
        audio : true, 
        echoCancellation : true 
       }, 
       // Success callback 
       user_media_setup, 
       // Error callback 
       function(err) { 
        console.log('The following gUM error occured: ' + err); 
       }); 
      } else { 
       console.log('getUserMedia not supported on your browser!'); 
      }; 

      function user_media_setup(stream) { 
       console.log('user media setup'); 
       // set up forked web audio context, for multiple browsers 
       // window. is needed otherwise Safari explodes 
       audioCtx = new (window.AudioContext || window.webkitAudioContext)(); 
       //microphone 
       microphone = audioCtx.createMediaStreamSource(stream); 

       //analyser 
       analyser = audioCtx.createAnalyser(); 
       analyser.fftSize = 1024; 
       analyser.smoothingTimeConstant = 0.85; 

       //convolver 
       convolver = audioCtx.createConvolver(); 
       convolver.normalize = true; 
       convolverBuffer = audioCtx.createBuffer(1, 1, audioCtx.sampleRate); 

       // convolverBuffer[0] = 1; //wrong 

       convolverChannel = convolverBuffer.getChannelData(0); 
       convolverChannel[0] = 1; 
       convolver.buffer = convolverBuffer; 

       //connectivity 
       var use_convolver = false; 
       if (use_convolver) { 
        //through convolver: 
        microphone.connect(convolver); 
        convolver.connect(analyser); 
       } else { 
        //direct: 
        microphone.connect(analyser); 

       } 
       visualize(); 
      } 

      function visualize() { 
       console.log('visualize'); 
       dataArray = new Float32Array(analyser.frequencyBinCount); 
       draw = function() { 
        analyser.getFloatFrequencyData(dataArray); 
        var data = []; 
        for (var i = 0; i < dataArray.length; i++) { 
         freq = audioCtx.sampleRate * i/dataArray.length/2; 
         data.push([freq, dataArray[i]]); 
        } 
        var options = { 
         yaxis : { 
          min : -200, 
          max : 0 
         } 
        }; 
        $.plot("#placeholder", [data], options); 
        window.requestAnimationFrame(draw); 
       }; 
       window.requestAnimationFrame(draw); 
      } 

     </script> 
    </body> 
</html> 

ответ

1

convolverBuffer [0] - это неправильный способ получить образцы данных в буфере. Вам нужно вызвать convolverBuffer.getChannelData (0), чтобы получить шаблонный массив для изменения.

+0

Спасибо @aldel. Я исправил это, но он все еще не работает в Chrome. В Firefox это действительно работает. Моя проблема с Firefox заключается в том, что кажется, что есть встроенный фильтр с отсечкой около 8 кГц (прежде чем применить любую фильтрацию или свертку) –

+1

@HananShteingart, хм, похоже, что Chrome не работает, когда вы используете 1-канальный буфер свертки. Если вы используете двухканальный буфер, он работает. Это кажется мне ошибкой в ​​Chrome; вы должны сообщить об этом. – aldel

+1

Возможно, вам также будет лучше с normalize = false. Нормализация определяется странно, и вы получите намного более низкий уровень на выходе, чем ввод, если вы нормализуете. – aldel

0

@aldel Эта проблема исказила меня в течение нескольких разочаровывающих дней .. большое спасибо за этот совет. Я могу подтвердить, что это проблема и в firefox. Кажется, если вы используете моно-WAV-файл в качестве буфера для свертывателя, вы не получите никакого вывода из сверточного устройства.

После того, как я переключился на стереофонический импульсный отклик WAV в качестве буфера, работал сокрушитель.

Кроме того, сегодня я узнал, что средства веб-аудиофайлов firefox (включенные щелчком шестерни в верхней правой части инструментов firefox dev и проверкой «веб-аудио» слева) действительно полезны для визуализации порядок ваших узлов. И вы можете легко переключать узел вкл/выкл (обходить его), чтобы убедиться, что это вызывает проблемы в вашем аудиоконференции.

+0

Также представляется, что если у вас есть нулевой буфер на ConvolverNode, он не будет выводить никакого звука. Это не совсем ясно в веб-аудиодокументах и ​​ведет себя немного иначе, чем другие узлы (которые могут быть созданы и по умолчанию звук будет проходить через них). –