Grabación de audio en Chrome para Android mediante la API de audio web y navigator.getUserMedia

Las versiones de Chrome para Android 30 y 31 beta en Android 4.1 no parecen grabar correctamente el audio utilizando HTML5 web audio y navigator.webkitGetUserMedia. (Se supone que Chrome 30+ en Android es compatible con estas API).

El síntoma es que el código parece funcionar correctamente, incluida la visualización de la solicitud para permitir o no el acceso al micrófono, pero los datos registrados no contienen más que ceros.

He creado un testcase simplificado (ir ahttp://jsfiddle.net/JCFtK/y haga clic en el botón Grabar, luego elija la opción apropiada para permitirle acceder a su micrófono). La parte clave del código se encuentra debajo (la función de "registro" es el punto 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');
}

La prueba muestra el valor de audio mínimo / máximo de cada bloque grabado. Cuando funciona, como ocurre en Chrome de escritorio, por ejemplo, verás que los valores mínimos y máximos varían según el ruido de fondo. Cuando no está funcionando, estos valores siempre son 0.000.

Este testcase FUNCIONA en lo siguiente:

Chrome 30 (Windows)Firefox 25 (Windows)Firefox 25 (Android 4.1) en un Sony Xperia MFirefox 25 (Android 4.1) en una tableta Samsung

Este caso de prueba NO FUNCIONA en lo siguiente:

Chrome 30 (Android 4.1) en un Sony Xperia MChrome beta 31 (Android 4.1) en un Sony Xperia MChrome 30 (Android 4.1) en una tableta Samsung

El testcase tampoco funciona en otros navegadores como Safari o IE, pero se espera que no sean compatibles con las API necesarias. Solo esperaba Chrome para Android, pero no funciona.

He presentado esto como un problema utilizando el proceso de informe de problemas de Chrome (que es privado y posiblemente un agujero negro), pero pensé que también preguntaría aquí: ¿Alguien está al tanto de las soluciones que arreglarían este código para poder hacerlo ¿Trabajas en Chrome para Android?

(Un requisito para mis propósitos es que el audio grabado debe ir a un controlador de eventos de JavaScript como el que se encuentra aquí y, por ejemplo, no directamente al servidor como parte de la carga de un formulario, que posiblemente ya funcione).

Me da la impresión de que esto es algo de vanguardia y no mucha gente está tratando de usarlo, pero pensé que valdría la pena preguntar. :)

Respuestas a la pregunta(1)

Su respuesta a la pregunta