2013-12-16 4 views
9

Я строю простое приложение, в котором я пытаюсь получить буфер, но, кажется, что onaudio процесс в следующем коде не стреляя: (PasteBin)Javascript аудио API: onaudioprocess не уволили

<script> 
var audio_context; 
var recorder; 
window.onload = function init() { 
    try { 
     window.AudioContext = window.AudioContext || window.webkitAudioContext; 
     navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia; 
     window.URL = window.URL || window.webkitURL; 
     audio_context = new AudioContext; 
     } catch (e) { 
     console.log(e); 
    } 
    navigator.getUserMedia({audio: true}, startUserMedia); 
    function startUserMedia(stream) { 
     console.log('Initializing'); 
     var input = audio_context.createMediaStreamSource(stream); 
     input.connect(audio_context.destination); 
     var node = input.context.createGain(4096, 2, 2); 
     node.onaudioprocess = function(e){ 
      console.log('done'); 
     } 
     node.connect(audio_context.destination); 
    } 
}; 
</script> 

Если код работает так, как должен, я должен получить Initiliazing \n done, проблема в том, что я получаю только Initiazing и onaudioprocess не уволен. Я использую Lastest хром:

enter image description here

+0

Попробуйте использовать 'addEventListener' вместо' onaudioprocess' – Musa

+0

К сожалению, я не мог заставить его работать с addEventListener :( – Deepsy

ответ

8

onaudioprocess не является собственностью GainNode, но ScriptProcessorNode. См. API reference here.

Я не очень опытный с Web Audio API, но если я правильно понял, что вам нужно, чтобы вставить его между вами получить узел и конечный пункт, чтобы иметь возможность обрабатывать эти события:

var node = input.context.createGain(4096, 2, 2); 
var processor = input.context.createScriptProcessor(4096,1,1); 

processor.onaudioprocess = function(e){ 
    console.log('done'); 
} 

node.connect(processor); 
processor.connect(audio_context.destination); 

Example at jsFiddle. Как вы можете видеть, на консоль печатается done, поскольку поток обрабатывается, но я ничего не могу сказать о правильности этой настройки (поскольку, как я уже сказал, мало опыта), пожалуйста, дважды проверьте соединения между узлами - и при необходимости отрегулируйте первый параметр (размер буфера).


Примечание: Я предполагаю, что вы хотите сделать что-то, что изменяет поток (не ясно, в вашем вопросе). Если вы хотите добавить что-нибудь другое (например, просто проанализируйте его), но не измените ввод, вы можете подключить узлы, как вы делали ранее (node и destination), и создать ScriptProcessorNode с одним входом, но нет выходов:

var node = input.context.createGain(4096, 2, 2); 
node.connect(audio_context.destination); 

var processor = input.context.createScriptProcessor(4096,1,0); 

processor.onaudioprocess = function(e){ 
    console.log('done'); 
} 

node.connect(processor); 
3

Вы также можете обойти это событие WebAudio и использовать собственный timeupdate событие Audio в. Он может соответствовать вашей цели, если вам не требуется событие с высоким разрешением (например, audioprocess).

В отличие от audioprocess, timeupdate стреляет только тогда, когда звук положение изменяется: когда он на самом деле играет или искать другое положение. Говорят, что он срабатывает один раз примерно через 250 мс (поэтому он является низкочастотным и, следовательно, более совершенным).

function startUserMedia(stream) { 
    stream.ontimeupdate = function() { 
     console.log(stream.currentTime); 
    }; 
    /* … */ 
} 

P.S.
В вашем примере, вы хотите console.log('done') в обработчике onaudioprocess. Это заставляет меня думать, что вы неправильно понимаете цель события. Он запускается непрерывно, ни разу что-то не делается с потоком.

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