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

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

Android 4.1 上的 Android 版本 30 和 31 Beta 版 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');
}

测试显示每个录制 block 的最小/最大音频值。当它工作时(例如在桌面 Chrome 中),您会看到最小/最大值根据背景噪音而变化。当它不工作时,这些值始终为 0.000。

此测试用例适用于以下情况:

  • Chrome 30(Windows)
  • Firefox 25(Windows)
  • 索尼 Xperia M 上的 Firefox 25 (Android 4.1)
  • 三星平板电脑上的 Firefox 25 (Android 4.1)

此测试用例在以下情况下不起作用:

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

该测试用例也无法在 Safari 或 IE 等其他浏览器中运行,但这是预期的,因为它们不支持必要的 API。我只希望在 Android 版 Chrome 上实现此功能,但事实并非如此。

我已使用 Chrome 问题报告流程(这是私有(private)的,可能是黑洞)将此问题提交为问题,但我想我还要在这里问:是否有人知道可以修复此代码的解决方法,以便我可以真的可以在 Android 版 Chrome 上运行吗?

(我的目的的一个要求是录制的音频必须发送到 JavaScript 事件处理程序,例如此处的事件处理程序,并且例如不能作为表单上传的一部分直接发送到服务器,这很可能已经可以工作了。)

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

最佳答案

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

关于android - 使用网络音频 API 和 navigator.getUserMedia 在 Android 版 Chrome 中录制音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20054273/

相关文章:

java - 为 TextView 赋值时出现 NullPointer 异常

css - 从 Chrome 开发者工具样式更改输入占位符颜色

javascript - 可以使用 Web Audio API 和 createMediaElementSource 分析来自 Icecast 的流音频吗?

javascript - 播放多个连续音频文件后出现延迟

android - Gradle - 无法使用 gradle 依赖项在 Android Studio 中导入 viewpagerindicator

android - 自定义 RES 屏幕和 RES 图标被替换为默认的 Cordova 屏幕和图标

css - Chrome/Safari 忽略我的重置规则?

javascript - Chrome 开发者工具 |呈现为 HTML 时预览 Pane 中的滚动问题

html5-audio - 如何通过 HTML5 音频元素直播原始 PCM

android - 如何在满足特定条件时结束android订阅?