使用网络音频API和navigator.getUserMedia在Chrome for Android中录制音频

时间:2013-11-18 17:45:05

标签: android google-chrome html5-audio audio-recording web-audio

适用于Android 4.1的Android版本30和31测试版的Chrome似乎无法使用HTML5网络音频和navigator.webkitGetUserMedia正确录制音频。 (Android上的Chrome 30+应该支持这些API。)

症状是代码似乎正常工作,包括显示是否允许麦克风访问的提示,但记录的数据只包含零。

我创建了一个简化的测试用例(转到http://jsfiddle.net/JCFtK/,然后单击“录制”按钮,然后选择适当的选项以允许它访问您的麦克风)。代码的关键部分如下('record'函数是入口点)。

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)
  • Sony Xperia M上的Firefox 25(Android 4.1)
  • 三星平板电脑上的Firefox 25(Android 4.1)

此测试用例不适用于以下内容:

  • Sony Xperia M上的Chrome 30(Android 4.1)
  • Sony Xperia M上的Chrome beta 31(Android 4.1)
  • 三星平板电脑上的Chrome 30(Android 4.1)

测试用例在Safari或IE等其他浏览器中也不起作用,但这是预期的,因为它们不支持必要的API。我只希望将这项功能用于Android,但事实并非如此。

我已经将此问题作为一个问题使用Chrome问题报告流程(这是私有的,可能是一个黑洞),但我想我也会在这里问:是否有人知道修复此代码的解决方法,所以我可以实际上它可以在Chrome for Android上运行吗?

(我的目的是要求录制的音频必须转到JavaScript事件处理程序,例如此处的处理程序,例如,不能直接作为表单上载的一部分直接发送到服务器,这很可能已经有效。)< / p>

我的印象是,这是最前沿的东西,并没有太多人试图使用它,但我认为这可能值得问。 :)

1 个答案:

答案 0 :(得分:3)

我们仍在开发Android的音频输入;它在版本31中启用,但它尚未在所有设备上启用。它适用于Nexus设备,至少--N4,N5,N7。