/ / Strumień API Web Audio: dlaczego nie zmienia się danych? - html5-audio, streaming audio, web-audio, streaming na żywo, audiokontekst

Web Audio API Stream: dlaczego nie zmienia się dataArray? - html5-audio, audio-streaming, web-audio, live-streaming, audiocontext

EDIT 2: rozwiązany. Zobacz odpowiedź poniżej.

EDYCJA 1:

Zmieniłem trochę kod, dodałem węzeł wzmocnienia, przesunąłem funkcję. Odkryłem również, że JEŚLI korzystam z mikrofonu, zadziała. Nadal nie działa z wejściem audio USB. Jakikolwiek pomysł? To jest mój obecny kod:

window.AudioContext = window.AudioContext || window.webkitAudioContext;

window.onload = function(){

var audioContext = new AudioContext();
var analyser = audioContext.createAnalyser();
var gainNode = audioContext.createGain();

navigator.mediaDevices.getUserMedia({ audio:true, video:false }).then(function(stream){ //MediaStream

var source = audioContext.createMediaStreamSource(stream);
source.connect(analyser);
analyser.connect(gainNode);
gainNode.connect(audioContext.destination);

listen();

});

function listen(){

analyser.fftSize = 256;
var bufferLength = analyser.frequencyBinCount;
var dataArray = new Uint8Array(bufferLength);
var index = 0;

function write(){
requestAnimationFrame(listen);
analyser.getByteTimeDomainData(dataArray);
$(".monitor").html(JSON.stringify(dataArray) + " -- " + (index++));
}

write();
}

}

STARY / ORIGINAL POST:

mój obecny kod jest taki, a obecnie podłączam kewboard przez interfejs audio USB: mam sygnał, już wypróbowany z innymi programami .. Więc:

window.AudioContext = window.AudioContext || window.webkitAudioContext;

window.onload = function(){

var audioContext = new AudioContext();
var analyser = audioContext.createAnalyser();

navigator.mediaDevices.getUserMedia({ audio:true, video:false }).then(function(stream){ //MediaStream

var source = audioContext.createMediaStreamSource(stream);
source.connect(analyser);
analyser.connect(audioContext.destination);

analyser.fftSize = 2048;
var bufferLength = analyser.frequencyBinCount;
var dataArray = new Uint8Array(bufferLength);

function listen(){
requestAnimationFrame(listen);
analyser.getByteTimeDomainData(dataArray);
$(".monitor").html(JSON.stringify(dataArray));
}

listen();

});
}

Kiedy gram na klawiaturze, dataArray w ogóle się nie zmienia. Czemu? Jestem nowy w tych sprawach, więc prawdopodobnie robię coś źle ...

Odpowiedzi:

0 dla odpowiedzi № 1

Ok, teraz działa. Mój podstawowy kod testu jest następujący. HTML ma tylko div.monitor do pisania wewnątrz. Obecnie testuję na firefox. Mój sprzęt to klawiatura> mikser> behringer UCA222> komputer (usb). Dostaję dane podczas grania na klawiaturze i teraz jestem szczęśliwy.

Istnieje kilka różnic w stosunku do oryginalnego kodu, ale myślę, że najważniejsze jest to, że zapisuję źródło multimediów na całym świecie (window.audiosource). Są tu inne posty dotyczące pokrewnego problemu, na przykład: Chrome: onaudioprocess przestaje być wywoływany po chwili i to Przechwytywanie mikrofonu HTML5 zatrzymuje się po 5 sekundach w Firefoksie.

window.AudioContext = window.AudioContext || window.webkitAudioContext;

navigator.getUserMedia = (navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia);

var audioContext = new (window.AudioContext || window.webkitAudioContext)();
var analyser = audioContext.createAnalyser();

if(navigator.getUserMedia){
navigator.getUserMedia(
{ audio: true }
,function(stream){
window.audiosource = audioContext.createMediaStreamSource(stream);
audiosource.connect(analyser);
listen();
}
,function(err){ console.log("The following gUM error occured: " + err); }
);
}

function listen(){
requestAnimationFrame(listen);

analyser.fftSize = 256;
var bufferLength = analyser.frequencyBinCount;
var dataArray = new Uint8Array(bufferLength);
analyser.getByteTimeDomainData(dataArray);
$(".monitor").html(JSON.stringify(dataArray));
}