从音频文件中获取频率表示
get frequency representation from audio file
我正在尝试获取 wav 文件的 fft。问题是我的频谱一直是无穷大。接收回无限意味着没有源连接到分析仪。我认为我的问题在于我如何在源变量中构建音频源。
我的代码可用 here
<html>
<body>
<input id="fileItem" type="file">
<script>
var audioContext = new AudioContext();
//Create analyser node
const analyserNode = audioContext.createAnalyser();
analyserNode.fftSize = 256;
const bufferLength = analyserNode.frequencyBinCount;
const dataArray = new Float32Array(bufferLength);
//setup audio souce
var source = audioContext.createBufferSource();
//Set up audio node network
source.connect(analyserNode);
analyserNode.connect(audioContext.destination);
var openFile = function(event) {
var input = event.target;
var reader = new FileReader();
reader.onload = function(){
var arrayBuffer = reader.result;
console.log("arrayBuffer:");
console.log(arrayBuffer);
audioContext.decodeAudioData(arrayBuffer, decodedDone);
};
reader.readAsArrayBuffer(input.files[0]);
};
function decodedDone(decoded) {
// set the buffer in the AudioBufferSourceNode
source.buffer = decoded;
source.connect(analyserNode);
source.start();
//Get spectrum data
analyserNode.getFloatFrequencyData(dataArray);
console.log(dataArray)
var typedArray = new Float32Array(decoded.length);
typedArray=dataArray//decoded.getChannelData(0);
console.log("typedArray:");
console.log(typedArray);
}
document.querySelector("#fileItem").onchange= openFile
</script>
</body>
</html>
这里有几个问题。您将 source
连接到 analyserNode
两次。无害,但没必要。
我认为真正的问题是您启动源然后立即请求频率数据。还没有时间允许源生成数据,因此 AnalyserNode 的内部缓冲区仍然全为零,因此输出为无穷大。
作为测试,使用 setTimeout 或其他方法暂停一下(尝试至少 10 毫秒左右),然后您应该会看到并非全部为无穷大的值。
我正在尝试获取 wav 文件的 fft。问题是我的频谱一直是无穷大。接收回无限意味着没有源连接到分析仪。我认为我的问题在于我如何在源变量中构建音频源。 我的代码可用 here
<html>
<body>
<input id="fileItem" type="file">
<script>
var audioContext = new AudioContext();
//Create analyser node
const analyserNode = audioContext.createAnalyser();
analyserNode.fftSize = 256;
const bufferLength = analyserNode.frequencyBinCount;
const dataArray = new Float32Array(bufferLength);
//setup audio souce
var source = audioContext.createBufferSource();
//Set up audio node network
source.connect(analyserNode);
analyserNode.connect(audioContext.destination);
var openFile = function(event) {
var input = event.target;
var reader = new FileReader();
reader.onload = function(){
var arrayBuffer = reader.result;
console.log("arrayBuffer:");
console.log(arrayBuffer);
audioContext.decodeAudioData(arrayBuffer, decodedDone);
};
reader.readAsArrayBuffer(input.files[0]);
};
function decodedDone(decoded) {
// set the buffer in the AudioBufferSourceNode
source.buffer = decoded;
source.connect(analyserNode);
source.start();
//Get spectrum data
analyserNode.getFloatFrequencyData(dataArray);
console.log(dataArray)
var typedArray = new Float32Array(decoded.length);
typedArray=dataArray//decoded.getChannelData(0);
console.log("typedArray:");
console.log(typedArray);
}
document.querySelector("#fileItem").onchange= openFile
</script>
</body>
</html>
这里有几个问题。您将 source
连接到 analyserNode
两次。无害,但没必要。
我认为真正的问题是您启动源然后立即请求频率数据。还没有时间允许源生成数据,因此 AnalyserNode 的内部缓冲区仍然全为零,因此输出为无穷大。
作为测试,使用 setTimeout 或其他方法暂停一下(尝试至少 10 毫秒左右),然后您应该会看到并非全部为无穷大的值。