如何在 javascript 中捕获音频?
How to capture audio in javascript?
我目前正在使用 getUserMedia()
,它仅适用于 Firefox 和 Chrome,但它已被弃用并且仅适用于 https(在 Chrome 中)。是否有任何 other/better 方法可以在 javascript 中获取适用于所有平台的语音输入?
例如web.whatsapp.com app 之类的网站如何录制音频? getUserMedia()
提示初次使用的用户允许录音,而 Whatsapp 应用程序不需要用户的许可。
我目前使用的getUserMedia()
是这样的:
navigator.getUserMedia(
{
"audio": {
"mandatory": {
"googEchoCancellation": "false",
"googAutoGainControl": "false",
"googNoiseSuppression": "false",
"googHighpassFilter": "false"
},
"optional": []
},
}, gotStream, function(e) {
console.log(e);
});
Chrome 60+ require using https, since getUserMedia
is a powerful feature。 API 访问权限不应在 non-secure 域中工作,因为 API 访问权限可能会转移到 non-secure 参与者。不过,Firefox 仍然支持 getUserMedia
而不是 http。
我一直在使用 RecorderJS,它很好地满足了我的目的。
这是一个代码示例。 (source)
function RecordAudio(stream, cfg) {
var config = cfg || {};
var bufferLen = config.bufferLen || 4096;
var numChannels = config.numChannels || 2;
this.context = stream.context;
var recordBuffers = [];
var recording = false;
this.node = (this.context.createScriptProcessor ||
this.context.createJavaScriptNode).call(this.context,
bufferLen, numChannels, numChannels);
stream.connect(this.node);
this.node.connect(this.context.destination);
this.node.onaudioprocess = function(e) {
if (!recording) return;
for (var i = 0; i < numChannels; i++) {
if (!recordBuffers[i]) recordBuffers[i] = [];
recordBuffers[i].push.apply(recordBuffers[i], e.inputBuffer.getChannelData(i));
}
}
this.getData = function() {
var tmp = recordBuffers;
recordBuffers = [];
return tmp; // returns an array of array containing data from various channels
};
this.start() = function() {
recording = true;
};
this.stop() = function() {
recording = false;
};
}
用法很简单:
var recorder = new RecordAudio(userMedia);
recorder.start();
recorder.stop();
var recordedData = recorder.getData()
编辑:如果没有效果,您可能还想检查这个answer。
getUserMedia()
并未弃用,弃用是在 http
上使用它。据我所知,目前唯一需要 https
for getUserMedia()
的浏览器是 Chrome 我认为正确的方法。
如果您想 ssl/tls
进行测试,您可以使用 CloudFlare 的免费版本。
Whatsapp 页面不提供任何录音功能,它只允许您启动应用程序。
Recorder JS 为您完成简单的工作。它适用于网络音频 API 节点
Chrome Firefox 浏览器现已进化。有一个内置的 MediaRecoder
API 可以为您录音。
navigator.mediaDevices.getUserMedia({audio:true})
.then(stream => {
rec = new MediaRecorder(stream);
rec.ondataavailable = e => {
audioChunks.push(e.data);
if (rec.state == "inactive"){
// Use blob to create a new Object URL and playback/download
}
}
})
.catch(e=>console.log(e));
工作demo
MediaRecoder
支持从
开始
Chrome支持:47
Firefox 支持:25.0
我目前正在使用 getUserMedia()
,它仅适用于 Firefox 和 Chrome,但它已被弃用并且仅适用于 https(在 Chrome 中)。是否有任何 other/better 方法可以在 javascript 中获取适用于所有平台的语音输入?
例如web.whatsapp.com app 之类的网站如何录制音频? getUserMedia()
提示初次使用的用户允许录音,而 Whatsapp 应用程序不需要用户的许可。
我目前使用的getUserMedia()
是这样的:
navigator.getUserMedia(
{
"audio": {
"mandatory": {
"googEchoCancellation": "false",
"googAutoGainControl": "false",
"googNoiseSuppression": "false",
"googHighpassFilter": "false"
},
"optional": []
},
}, gotStream, function(e) {
console.log(e);
});
Chrome 60+ require using https, since getUserMedia
is a powerful feature。 API 访问权限不应在 non-secure 域中工作,因为 API 访问权限可能会转移到 non-secure 参与者。不过,Firefox 仍然支持 getUserMedia
而不是 http。
我一直在使用 RecorderJS,它很好地满足了我的目的。 这是一个代码示例。 (source)
function RecordAudio(stream, cfg) {
var config = cfg || {};
var bufferLen = config.bufferLen || 4096;
var numChannels = config.numChannels || 2;
this.context = stream.context;
var recordBuffers = [];
var recording = false;
this.node = (this.context.createScriptProcessor ||
this.context.createJavaScriptNode).call(this.context,
bufferLen, numChannels, numChannels);
stream.connect(this.node);
this.node.connect(this.context.destination);
this.node.onaudioprocess = function(e) {
if (!recording) return;
for (var i = 0; i < numChannels; i++) {
if (!recordBuffers[i]) recordBuffers[i] = [];
recordBuffers[i].push.apply(recordBuffers[i], e.inputBuffer.getChannelData(i));
}
}
this.getData = function() {
var tmp = recordBuffers;
recordBuffers = [];
return tmp; // returns an array of array containing data from various channels
};
this.start() = function() {
recording = true;
};
this.stop() = function() {
recording = false;
};
}
用法很简单:
var recorder = new RecordAudio(userMedia);
recorder.start();
recorder.stop();
var recordedData = recorder.getData()
编辑:如果没有效果,您可能还想检查这个answer。
getUserMedia()
并未弃用,弃用是在 http
上使用它。据我所知,目前唯一需要 https
for getUserMedia()
的浏览器是 Chrome 我认为正确的方法。
如果您想 ssl/tls
进行测试,您可以使用 CloudFlare 的免费版本。
Whatsapp 页面不提供任何录音功能,它只允许您启动应用程序。
Recorder JS 为您完成简单的工作。它适用于网络音频 API 节点
Chrome Firefox 浏览器现已进化。有一个内置的 MediaRecoder
API 可以为您录音。
navigator.mediaDevices.getUserMedia({audio:true})
.then(stream => {
rec = new MediaRecorder(stream);
rec.ondataavailable = e => {
audioChunks.push(e.data);
if (rec.state == "inactive"){
// Use blob to create a new Object URL and playback/download
}
}
})
.catch(e=>console.log(e));
工作demo
MediaRecoder
支持从
Chrome支持:47
Firefox 支持:25.0