Aufnehmen von Audio in Chrome für Android mit der Web-Audio-API und navigator.getUserMedia

Chrome für Android-Versionen 30 und 31 (Beta) unter Android 4.1 zeichnen anscheinend Audio nicht korrekt mit HTML5-Web-Audio und navigator.webkitGetUserMedia auf. (Chrome 30+ unter Android soll diese APIs unterstützen.)

Das Symptom ist, dass der Code anscheinend korrekt funktioniert, einschließlich der Aufforderung, den Mikrofonzugriff zuzulassen oder nicht, aber aufgezeichnete Daten enthalten nur Nullen.

Ich habe einen vereinfachten Testfall erstellt (gehe zuhttp://jsfiddle.net/JCFtK/, und klicken Sie auf die Schaltfläche Aufnehmen. Wählen Sie dann die entsprechende Option aus, damit das Mikrofon darauf zugreifen kann. Der Schlüsselteil des Codes befindet sich unten (die 'Aufnahme'-Funktion ist der Einstiegspunkt).

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

Der Test zeigt den minimalen / maximalen Audiowert von jedem aufgezeichneten Block. Wenn es funktioniert, wie es beispielsweise in Desktop Chrome der Fall ist, werden die Min- / Max-Werte je nach Hintergrundgeräusch unterschiedlich angezeigt. Wenn es nicht funktioniert, sind diese Werte immer 0,000.

Dieser Testfall FUNKTIONIERT folgendermaßen:

Chrome 30 (Windows)Firefox 25 (Windows)Firefox 25 (Android 4.1) auf einem Sony Xperia MFirefox 25 (Android 4.1) auf einem Samsung-Tablet

Dieser Testfall FUNKTIONIERT NICHT in folgenden Fällen:

Chrome 30 (Android 4.1) auf einem Sony Xperia MChrome Beta 31 (Android 4.1) auf einem Sony Xperia MChrome 30 (Android 4.1) auf einem Samsung-Tablet

Der Testfall funktioniert auch nicht in anderen Browsern wie Safari oder IE, dies wird jedoch erwartet, da sie die erforderlichen APIs nicht unterstützen. Es ist nur Chrome für Android, von dem ich gehofft habe, dass es funktioniert, aber das tut es nicht.

Ich habe dies als Problem mit dem Chrome-Problemberichterstattungsprozess (der privat und möglicherweise ein schwarzes Loch ist) eingereicht, aber ich dachte, ich würde auch hier fragen: Kennt jemand Problemumgehungen, die diesen Code beheben würden, damit ich ihn tatsächlich erstellen kann? Arbeiten Sie mit Chrome für Android?

(Eine Anforderung für meine Zwecke besteht darin, dass die aufgenommenen Audiodaten zu einem JavaScript-Ereignishandler wie dem hier gezeigten und beispielsweise nicht direkt zum Server als Teil eines Formular-Uploads geleitet werden müssen, was möglicherweise bereits funktioniert.)

Ich habe den Eindruck, dass dies auf dem neuesten Stand ist und nicht zu viele Leute versuchen, es zu benutzen, aber ich dachte, es könnte sich lohnen, danach zu fragen. :)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage