Регистрация звука в Chrome для Android с помощью веб-аудио API и Navigator. GetUsermedia
-
27-12-2019 - |
Вопрос
Chrome для версий Android версий 30 и 31 бета-версии на Android 4.1 не отображается правильно записи звука с помощью веб-аудио и навигатора HTML5. (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');
}
.
Испытание показывает звуковое значение min / Max от каждого записанного блока. Когда он работает - как он делает в настольном Chrome, например, вы увидите значения MIN / MAX варьируются в зависимости от фонового шума. Когда не работает, эти значения всегда 0,000.
Этот тестский пример работает следующим:
- .
- Chrome 30 (Windows)
- firefox 25 (Windows)
- firefox 25 (Android 4.1) на Sony Xperia M
- firefox 25 (андроид 4.1) на планшете Samsung
Этот тестовый случай не работает следующим:
- .
- Chrome 30 (Android 4.1) на Sony Xperia M
- Chrome Beta 31 (Android 4.1) на Sony Xperia M
- Chrome 30 (Android 4.1) на планшете Samsung
Testcase также не работает в других браузерах, таких как Safari или IE, но это ожидается, что они не поддерживают необходимые API. Это только Chrome для Android, что я надеялся сделать эту работу, но это не так.
Я подал это как проблему, используя процесс отчетности Chrome Emposit, (который является частным и, возможно, черная дыра), но я думал, что я также спрошу здесь: кто-нибудь осознает обходные пути, которые будут решить этот код, чтобы я мог на самом деле заставить его работать на Chrome для Android?
(требование для моих целей заключается в том, что записанное аудио должно перейти на обработчик событий JavaScript, например, здесь, и, например, непосредственно на сервер как часть загрузки формы, которая очень, возможно, может работать уже.) < / P >.
У меня сложилось впечатление, что это кровотечение, и не слишком много людей пытаются его использовать, но я подумал, что это возможно, стоит спросить. :)
Решение
Мы все еще работаем над аудиовходом в Android;Он включен в версии 31, но он еще не включен на все устройства.Он работает на устройствах Nexus, по крайней мере, - N4, N5, N7.