A gravação de áudio no Chrome para Android usando web API de áudio e de navegação.getUserMedia
-
27-12-2019 - |
Pergunta
O Chrome para Android versões de 30 e 31 de beta no Android 4.1 não aparecer corretamente gravar áudio, usando HTML5 web de áudio e de navegação.webkitGetUserMedia.(Chrome 30+ Android é suposto para dar suporte a essas APIs.)
O sintoma é que o código aparece para funcionar corretamente, incluindo exibir o prompt para se permite ou não o microfone para o access, mas os dados gravados contém nada, mas zeros.
Eu criei um sistema simplificado de testcase (vá para http://jsfiddle.net/JCFtK/, e clique em botão Gravar e, em seguida, escolha a opção apropriada para permitir o acesso que o seu microfone).A parte chave do código está abaixo ("registro" função é o ponto de entrada).
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');
}
O teste mostra o min/max de áudio valor de cada registrada do bloco.Quando ele está trabalhando - como acontece no ambiente de trabalho google Chrome, por exemplo - você vai ver o min/máx valores variam de acordo com o ruído de fundo.Quando não está trabalhando, esses valores são sempre 0.000.
Este testcase FUNCIONA no seguinte:
- Chrome 30 (Windows)
- Firefox 25 (Windows)
- Firefox 25 (Android 4.1) em um Sony Xperia M
- Firefox 25 (Android 4.1) em um Samsung tablet
Este caso de teste NÃO FUNCIONA no seguinte:
- Chrome 30 (Android 4.1) em um Sony Xperia M
- Chrome beta 31 (Android 4.1) em um Sony Xperia M
- Chrome 30 (Android 4.1) em um Samsung tablet
O testcase também não funciona em outros navegadores, como o Safari ou IE, mas isso é esperado, pois eles não oferecem suporte a APIs necessárias.É apenas o Chrome para Android que eu estava esperando para fazer esse trabalho, mas ele não.
Eu tenho arquivado esse como um problema usando o google Chrome problema do processo de comunicação (que é privada e, possivelmente, um buraco negro), mas eu pensei que eu ia também perguntar aqui:é alguém consciente de soluções que iria corrigir este código para que eu possa realmente fazer funcionar no Chrome para Android?
(Um requisito para os meus propósitos, é que o áudio gravado, deve ir para um manipulador de eventos JavaScript, tais como a aqui, por exemplo,não diretamente para o servidor como parte de um formulário de upload, que muito possivelmente poderia trabalhar já.)
Eu tenho a impressão de que este é o sangramento da borda coisas e muitas pessoas não estão tentando usá-lo, mas eu pensei que poderia ser a pena perguntar.:)
Solução
Nós ainda estamos trabalhando na entrada de áudio no Android;ele está habilitado na versão 31, mas não é ativado em todos os dispositivos ainda.Ele funciona em dispositivos Nexus, que, pelo menos, N4, N5, N7.