我正在使用HTML5 webkitAudioContext使用以下代码获取用户麦克风的实时级别:
var liveSource;
function getLevel(){
var context = new webkitAudioContext();
navigator.webkitGetUserMedia({audio: true}, function(stream) {
liveSource = context.createMediaStreamSource(stream);
liveSource.connect(context.destination);
var levelChecker = context.createJavaScriptNode(4096, 1 ,1);
liveSource.connect(levelChecker);
levelChecker.connect(context.destination);
levelChecker.onaudioprocess = function(e) {
var buffer = e.inputBuffer.getChannelData(0);
var maxVal = 0;
// Iterate through buffer to check if any of the |values| exceeds 1.
for (var i = 0; i < buffer.length; i++) {
if (maxVal < buffer[i]) {
maxVal = buffer[i];
}
}
if(maxVal <= 0.01){
console.log(0.0);
} else if(maxVal > 1){
console.log(1);
} else if(maxVal > 0.2){
console.log(0.2);
} else if(maxVal > 0.1){
console.log(0.1);
} else if(maxVal > 0.05){
console.log(0.05);
} else if(maxVal > 0.025){
console.log(0.025);
} else if(maxVal > 0.01){
console.log(0.01);
}
};
});
}
getLevel();
如果您将其复制并粘贴到控制台并单击麦克风附近的手指(假设您已启用麦克风输入),您将看到它工作几秒钟,然后突然停止。它不会报告任何错误。任何人都可以解释为什么会这样吗?感谢
有关级别正常工作的示例,请参阅http://labs.dinahmoe.com/dynamicmusicengine/。
答案 0 :(得分:3)
我有同样的问题,但终于得到了解决方案!问题是javascript节点cicle。 我建议你先改变createJavaScriptNode():
var levelChecker = context.createScriptProcessor(4096, 1 ,1);
垃圾收集器“levelChecker”变量和onaudioprocess存在问题,因此您必须将脚本处理器或onaudioProcess回调绑定到窗口。这里是HOLY SOLUTION:
levelChecker.onaudioprocess = window.audioProcess = function(e) { ...
只需在该行中添加window.audioProcess,就不会再遇到问题了。
您可在此处找到更多信息:http://lists.w3.org/Archives/Public/public-audio/2013JanMar/0304.html
希望对你有用!