Nagrywanie dźwięku w Chrome na Androida za pomocą interfejsu API web audio i navigator.getUserMedia

Chrome na Androida w wersji 30 i 31 w wersji beta na Androida 4.1 nie wydaje się poprawnie nagrywać dźwięku za pomocą audio w sieci HTML5 i navigator.webkitGetUserMedia. (Chrome 30+ na Androidzie ma obsługiwać te interfejsy API).

Symptomem jest to, że kod wydaje się działać poprawnie, włącznie z wyświetlaniem monitu o to, czy zezwolić na dostęp do mikrofonu, ale zapisane dane zawierają tylko zera.

Stworzyłem uproszczoną skrzynkę testową (przejdź dohttp://jsfiddle.net/JCFtK/i kliknij przycisk Nagraj, a następnie wybierz odpowiednią opcję, aby umożliwić dostęp do mikrofonu). Kluczowa część kodu znajduje się poniżej (funkcja „rekord” to punkt wejścia).

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');
}

Test pokazuje minimalną / maksymalną wartość audio z każdego nagranego bloku. Kiedy działa - jak to ma miejsce na przykład w Chrome na pulpicie - zobaczysz, że wartości min / max różnią się w zależności od szumu tła. Gdy nie działa, wartości te wynoszą zawsze 0,000.

Ten testcase działa w następujący sposób:

Chrome 30 (Windows)Firefox 25 (Windows)Firefox 25 (Android 4.1) na Sony Xperia MFirefox 25 (Android 4.1) na tablecie Samsung

Ten przypadek testowy NIE DZIAŁA w następujących przypadkach:

Chrome 30 (Android 4.1) na Sony Xperia MChrome beta 31 (Android 4.1) na Sony Xperia MChrome 30 (Android 4.1) na tablecie Samsung

Testcase nie działa również w innych przeglądarkach, takich jak Safari lub IE, ale jest to oczekiwane, ponieważ nie obsługują niezbędnych interfejsów API. To tylko Chrome na Androidzie, na którym miałem nadzieję wykonać tę pracę, ale tak nie jest.

Zgłoszę to jako problem za pomocą procesu zgłaszania problemów z Chrome (który jest prywatny i prawdopodobnie czarna dziura), ale pomyślałem, że również tutaj spytam: czy ktoś wie o obejściach, które naprawiłyby ten kod, abym mógł to zrobić działa na Chrome na Androida?

(Wymóg moich celów polega na tym, że nagrany dźwięk musi zostać przekazany do obsługi zdarzeń JavaScript, takiej jak ta tutaj, a na przykład nie bezpośrednio do serwera w ramach przesyłania formularza, co prawdopodobnie może już działać.)

Odnoszę wrażenie, że jest to krwawiący materiał i niewiele osób próbuje go użyć, ale pomyślałem, że warto o to zapytać. :)

questionAnswers(1)

yourAnswerToTheQuestion