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.:)

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top