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/