Pregunta

Chrome para las versiones de Android 30 y 31 Beta en Android 4.1 No parece que grabe audio correctamente usando HTML5 Web Audio y Navigator. WebkitgetUsermedia. (Chrome 30+ en Android se supone que es compatible con estas API.)

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

He creado un testcase simplificado (vaya a http://jsfiddle.net/jcftk/ y haga clic en Botón de grabación, luego elija la opción apropiada para permitirle acceder a su micrófono). La parte clave del código está a continuación (la función 'récord' 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 MIN / MAX de cada bloque grabado. Cuando está funcionando, como lo hace en el escritorio, Chrome, por ejemplo, verá que los valores mín / máx. Varían dependiendo del ruido de fondo. Cuando no funciona, estos valores son siempre 0.000.

Este testcase funciona a continuación:

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

Este caso de prueba no funciona a continuación:

  • Chrome 30 (Android 4.1) en un Sony Xperia M
  • Chrome Beta 31 (Android 4.1) en un Sony Xperia M
  • Chrome 30 (Android 4.1) en una tableta de Samsung

El testaconal tampoco funciona en otros navegadores, como Safari o IE, pero eso se espera, ya que no admiten las API necesarias. Solo es cromado para Android que esperaba hacer este trabajo, pero no lo hace.

He presentado esto como un problema utilizando el proceso de informes de emisión de cromo (que es privado y posiblemente un agujero negro), pero pensé que también preguntaba aquí: ¿Alguien es consciente de las soluciones que solucionarían este código para que pueda ¿En realidad haz que funcione en Chrome para Android?

(un requisito para mis propósitos es que el audio grabado debe ir a un manejador de eventos de JavaScript como el aquí, y por ejemplo, no directamente al servidor como parte de una carga de formulario, que es muy posiblemente funcionar). / p>

Tengo la impresión de que esto es una cosa de vanguardia y no mucha gente está tratando de usarlo, pero pensé que podría valer la pena preguntar. :)

¿Fue útil?

Solución

Todavía estamos trabajando en la entrada de audio en Android;Está habilitado en la versión 31, pero aún no está encendido a través de todos los dispositivos.Funciona en dispositivos Nexus, al menos - N4, N5, N7.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top