我已经使用网络音频api将麦克风连接到卷积器、分析器和flot图形用户界面来绘制频谱。为了测试,我将卷积器的缓冲区设置为1,但没有得到任何输出。如果我绕过卷积器,把麦克风直接连接到分析仪上,它就能工作了。你能帮帮忙吗?
在下面的代码中,use_convolver
确定是否绕过卷积器。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="http://www.flotcharts.org/flot/jquery.flot.js" type="text/javascript"></script>
</head>
<body>
<h1>Audio Spectrum</h1>
<div id="placeholder" style="width:400px; height:200px; display: inline-block;">
</div>
<script>
var microphone;
var analyser;
var convolver;
//user media
navigator.getUserMedia = (navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia);
if (navigator.getUserMedia) {
console.log('getUserMedia supported.');
navigator.getUserMedia(
// constraints - only audio needed for this app
{
audio : true,
echoCancellation : true
},
// Success callback
user_media_setup,
// Error callback
function(err) {
console.log('The following gUM error occured: ' + err);
});
} else {
console.log('getUserMedia not supported on your browser!');
};
function user_media_setup(stream) {
console.log('user media setup');
// set up forked web audio context, for multiple browsers
// window. is needed otherwise Safari explodes
audioCtx = new (window.AudioContext || window.webkitAudioContext)();
//microphone
microphone = audioCtx.createMediaStreamSource(stream);
//analyser
analyser = audioCtx.createAnalyser();
analyser.fftSize = 1024;
analyser.smoothingTimeConstant = 0.85;
//convolver
convolver = audioCtx.createConvolver();
convolver.normalize = true;
convolverBuffer = audioCtx.createBuffer(1, 1, audioCtx.sampleRate);
// convolverBuffer[0] = 1; //wrong
convolverChannel = convolverBuffer.getChannelData(0);
convolverChannel[0] = 1;
convolver.buffer = convolverBuffer;
//connectivity
var use_convolver = false;
if (use_convolver) {
//through convolver:
microphone.connect(convolver);
convolver.connect(analyser);
} else {
//direct:
microphone.connect(analyser);
}
visualize();
}
function visualize() {
console.log('visualize');
dataArray = new Float32Array(analyser.frequencyBinCount);
draw = function() {
analyser.getFloatFrequencyData(dataArray);
var data = [];
for (var i = 0; i < dataArray.length; i++) {
freq = audioCtx.sampleRate * i / dataArray.length / 2;
data.push([freq, dataArray[i]]);
}
var options = {
yaxis : {
min : -200,
max : 0
}
};
$.plot("#placeholder", [data], options);
window.requestAnimationFrame(draw);
};
window.requestAnimationFrame(draw);
}
</script>
</body>
</html>
发布于 2015-07-23 08:07:07
convolverBuffer是获取缓冲区中样本数据的错误方式。您需要调用convolverBuffer.getChannelData(0)来获取要修改的示例数组。
发布于 2016-04-05 04:34:54
@aldel这个问题困扰了我好几天。非常感谢你的建议。我可以确认这在firefox中也是一个问题。似乎如果你使用一个单声道的WAV文件作为卷积器的缓冲区,你将不会从卷积器得到任何输出。
在我切换到立体声WAV脉冲响应作为缓冲后,卷积器工作了。
另外,我今天了解到的一个提示是,firefox的web音频工具(通过单击firefox开发工具右上角的齿轮,并选中左侧的'web音频‘)对于可视化节点的顺序非常有用。你可以很容易地打开/关闭一个节点(绕过它),看看这是否在你的音频环境中引起了问题。
https://stackoverflow.com/questions/31575002
复制相似问题