Запись звука в Chrome для Android с использованием веб-аудио API и navigator.getUserMedia
Бета-версия Chrome для Android 30 и 31 на Android 4.1 не позволяет правильно записывать звук с помощью веб-аудио HTML5 и navigator.webkitGetUserMedia. (Предполагается, что Chrome 30+ на Android поддерживает эти API.)
Симптом заключается в том, что код работает правильно, в том числе отображается подсказка о том, разрешить или нет доступ к микрофону, но записанные данные содержат только нули.
Я создал упрощенный тестовый пример (перейдите кhttp://jsfiddle.net/JCFtK/и нажмите кнопку «Запись», затем выберите соответствующий параметр, чтобы разрешить доступ к вашему микрофону) Ключевая часть кода находится ниже (функция «запись» является точкой входа).
function processAudioBuffer(e) {
var floats = e.inputBuffer.getChannelData(0);
var min = 0, max = 0;
for (var i = 0; i < floats.length; i++) {
var current = floats[i];
min = Math.min(current, min);
max = Math.max(current, max);
}
log('Block min/max: ' + min.toFixed(3) + ', ' + max.toFixed(3));
}
function record() {
if (!window.AudioContext) {
window.AudioContext = window.webkitAudioContext;
}
if (!navigator.getUserMedia) {
navigator.getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
}
data.context = new AudioContext();
navigator.getUserMedia({audio: true}, function(stream) {
data.mediaStream = stream;
startAudio();
}, function(error) {
log('Stream get error: ' + error);
});
}
function startAudio() {
// Get input media stream.
data.audioStream = data.context.createMediaStreamSource(data.mediaStream);
// Set up JS processor.
data.processor = data.context.createScriptProcessor(2048, 1, 1);
data.processor.onaudioprocess = processAudioBuffer;
// You need to connect the output of processor to the audio output or it
// doesn't work. (In Firefox, connecting it just to a gain node works;
// in Chrome you have to connect to output like this.)
data.processor.connect(data.context.destination);
// Connect input stream to processor, then we're done.
data.audioStream.connect(data.processor);
log('Stream connected OK');
}
Тест показывает минимальное / максимальное значение звука для каждого записанного блока. Когда он работает - как, например, в настольном Chrome, вы увидите, что минимальные / максимальные значения меняются в зависимости от фонового шума. Когда он не работает, эти значения всегда 0,000.
Этот тест работает в следующем:
Chrome 30 (Windows)Firefox 25 (Windows)Firefox 25 (Android 4.1) на Sony Xperia MFirefox 25 (Android 4.1) на планшете SamsungЭтот тест НЕ РАБОТАЕТ в следующих случаях:
Chrome 30 (Android 4.1) на Sony Xperia MChrome beta 31 (Android 4.1) на Sony Xperia MChrome 30 (Android 4.1) на планшете SamsungТестовый пример также не работает в других браузерах, таких как Safari или IE, но это ожидаемо, поскольку они не поддерживают необходимые API. Я надеялся заставить работать только Chrome для Android, но это не так.
Я подал это как проблему, используя процесс сообщения о проблемах Chrome (который является частным и, возможно, черной дырой), но я подумал, что я также хотел бы спросить здесь: кто-нибудь знает об обходных путях, которые исправят этот код, чтобы я мог на самом деле сделать его работать на Chrome для Android?
(Для моих целей необходимо, чтобы записанное аудио передавалось обработчику событий JavaScript, например, здесь, а не напрямую на сервер, как часть загрузки формы, что, возможно, уже может работать.)
У меня сложилось впечатление, что это ультрасовременный материал, и не так уж много людей пытаются его использовать, но я подумал, что стоит спросить. :)