Запись звука в Chrome для Android с использованием веб-аудио API и navigator.getUserMedia

Бета-версия Chrome для Android 30 и 31 на Android 4.1 не позволяет правильно записывать звук с помощью веб-аудио HTML5 и navigator.webkitGetUserMedia. (Предполагается, что 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');
}

Тест показывает минимальное / максимальное значение звука для каждого записанного блока. Когда он работает - как, например, в настольном Chrome - выПосмотрим, как минимальные / максимальные значения меняются в зависимости от фонового шума. Когда он не работает, эти значения всегда 0,000.

Этот тест работает в следующем:

Chrome 30 (Windows)Firefox 25 (Windows)Firefox 25 (Android 4.1) на Sony Xperia MFirefox 25 (Android 4.1) на планшете Samsung

Этот тест НЕ РАБОТАЕТ в следующих случаях:

Chrome 30 (Android 4.1) на Sony Xperia MChrome beta 31 (Android 4.1) на Sony Xperia MChrome 30 (Android 4.1) на планшете Samsung

Тестовый случай также неработать в других браузерах, таких как Safari или IE, но этоожидается, поскольку они не поддерживают необходимые API. Это'Это только Chrome для Android, на котором я надеялся сделать это, но это не так.t.I»

Мы подали это как проблему, используя процесс сообщения о проблемах Chrome (который является частным и, возможно, черной дырой), но я подумал, чтоТакже я хотел бы спросить здесь: кто-нибудь знает об обходных путях, которые могли бы исправить этот код, чтобы я мог заставить его работать на Chrome для Android?

(Для моих целей необходимо, чтобы записанное аудио передавалось обработчику событий JavaScript, например, здесь, а не напрямую на сервер, как часть загрузки формы, что, возможно, уже может работать.)

У меня сложилось впечатление, что это ультрасовременный материал, и не так уж много людей пытаются его использовать, но я подумал, что стоит спросить. :)»

Ответы на вопрос(1)

Ваш ответ на вопрос