Поток микрофона в динамик (JS)

#javascript #html #html5-audio #microphone #web-audio-api

#javascript #HTML #html5-аудио #микрофон #веб-аудио-api

Вопрос:

Я много играл с HTML5, но не могу выполнить следующее. Javascript должен запросить разрешение на доступ к микрофону, а затем он должен передавать микрофонный вход на динамики компьютера. Это тот javascript, который у меня был:

 navigator.getUserMedia = ( navigator.getUserMedia    || navigator.webkitGetUserMedia ||
                           navigator.mozGetUserMedia ||navigator.msGetUserMedia);
var aCtx;
var analyser;
var microphone;
if (navigator.getUserMedia) {
    navigator.getUserMedia({audio: true}, function(stream) {
        aCtx = new webkitAudioContext();
        analyser = aCtx.createAnalyser();
        microphone = aCtx.createMediaStreamSource(stream);
        microphone.connect(analyser);
        analyser.connect(aCtx.destination);
    });
};
 

Но Chrome (и Opera) говорят

 Uncaught TypeError: Failed to execute 'webkitGetUserMedia' on 'Navigator': 3 arguments required, but only 2 present. 
 

Зачем ему нужны дополнительные аргументы?
Кто-нибудь может, пожалуйста, помочь мне с javascript для этого?

Спасибо.

Комментарии:

1. ошибка обратного вызова, если я прав. Selecting a media source @ ~50%: html5rocks.com/en/tutorials/getusermedia/intro

2. Google MDN getUserMedia -> navigator.getUserMedia ( constraints, successCallback, errorCallback );

Ответ №1:

API для getUserMedia требует 3 аргумента.

Пусть ограничения будут первым аргументом метода.

Пусть successCallback — это обратный вызов, указанный вторым аргументом метода.

Пусть errorCallback будет обратным вызовом, указанным третьим аргументом метода.

Обратитесь к спецификации mediacapture-stream

Итак, все, что вам нужно сделать, это добавить 3-й аргумент, который является обратным вызовом с ошибкой. Что-то вроде этого сработало бы.

 navigator.getUserMedia = ( navigator.getUserMedia    || navigator.webkitGetUserMedia ||
                       navigator.mozGetUserMedia ||navigator.msGetUserMedia);
var aCtx;
var analyser;
var microphone;
if (navigator.getUserMedia) {
    navigator.getUserMedia({audio: true}, function(stream) {
        aCtx = new webkitAudioContext();
        analyser = aCtx.createAnalyser();
        microphone = aCtx.createMediaStreamSource(stream);
        microphone.connect(analyser);
        analyser.connect(aCtx.destination);
    }, function (){console.warn("Error getting audio stream from getUserMedia")});
};
 

Вы можете посмотреть на этот фрагмент кода, который делает что-то подобное для справки.