从wav文件中读取样本
Read samples from wav-file
我正在尝试用html5制作一个网页,它将wav文件中的样本数据存储在数组中。有没有办法用javascript获取样本数据?我正在使用文件输入来选择wav文件。
在我已经添加的javascript中:
document.getElementById('fileinput').addEventListener('change', readFile, false);
但我不知道在readFile中该做什么。
编辑:我试图在ArrayBuffer中获取该文件,将其传递给decodeAudioData方法,并从中获取typedArraybuffer。这是我的代码:
var openFile = function(event) {
var input = event.target;
var audioContext = new AudioContext();
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) {
var typedArray = new Uint32Array(decoded, 1, decoded.length);
console.log("decoded");
console.log(decoded);
console.log("typedArray");
console.log(typedArray);
for (i=0; i<10; i++)
{
console.log(typedArray[i]);
}
}
typedArray的元素都是0。我创建typedArray的方式是错误的,还是我在上做了其他错误的事情?
编辑:我终于拿到了。这是我的代码:
var openFile = function(event) {
var input = event.target;
var audioContext = new AudioContext();
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) {
var typedArray = new Float32Array(decoded.length);
typedArray=decoded.getChannelData(0);
console.log("typedArray:");
console.log(typedArray);
}
谢谢你的回答!
要实现这一点,您需要学习很多关于Web API的知识,但最终很简单。
- 使用file API获取ArrayBuffer中的文件内容
- 将其传递给Web Audio API的decodeAudioData方法。
- 获取一个带有所需原始样本的类型化ArrayBuffer。
编辑:如果你想实现均衡器,你是在浪费时间,在音频API中有一个本地均衡器节点。根据波形文件的长度,最好不要将其全部加载到内存中,而只创建一个从中读取的源,并将该源连接到均衡器节点。
下面是一个简单的代码示例,用于从JavaScript中的wav
音频文件中获取Float32Array
:
let audioData = await fetch("https://example.com/test.wav").then(r => r.arrayBuffer());
let audioCtx = new AudioContext({sampleRate:44100});
let decodedData = await audioCtx.decodeAudioData(audioData); // audio is resampled to the AudioContext's sampling rate
console.log(decodedData.length, decodedData.duration, decodedData.sampleRate, decodedData.numberOfChannels);
let float32Data = decodedData.getChannelData(0); // Float32Array for channel 0
用异步函数封装Joe的代码是有效的。像这样:
async function readAudio(url) {
let audioData = await fetch(url).then(r => r.arrayBuffer());
let audioCtx = new AudioContext({sampleRate:8000});
// audio is resampled to the AudioContext's sampling rate
let decodedData = await audioCtx.decodeAudioData(audioData);
console.log(decodedData.length, decodedData.duration,
decodedData.sampleRate, decodedData.numberOfChannels);
let float32Data = decodedData.getChannelData(0); // Float32Array for channel 0
processAudio(float32Data); // PCM Float32 is between -1 to +1
}
readAudio("Something.wav");
相关文章:
- 从桌面读取python文件时高亮显示代码
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 使用Dnamics CRM 2011中的JavaScript读取子网格的所有记录,而不考虑活动页面
- 节点Js:How to catch a“;没有这样的文件或目录“;读取线模块出错
- TypeError:无法读取属性'推'未定义的JavaScript
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- 未捕获的TypeError无法读取未定义的属性socialsharing
- 如何在读取XLS/XLSX本地文件时,使用IE的javascript代码启用未标记为安全的ActiveX控件
- 字符串在将其传递给另一个活动Android JavaScript时读取Null
- NodeJS-readline暂停和恢复事件发射器(逐行读取)
- 未捕获的类型错误:无法读取属性'删除'的未定义
- AngularJS指令出错-无法读取属性'编译'的未定义
- 未捕获的类型错误:无法读取属性'name'即使它存在,也无法定义
- 如何在Javascript中读取unsigned int
- 如何读取表单中的输入数据
- 通过传递图像的URL通过javascript读取/处理图像-类似于PHP中的file_get_contents
- 看到“;未捕获的类型错误:无法读取属性'weight'未定义的“;尽管按照字面上的指示
- angularjs无法读取未定义的属性then
- 从wav文件中读取样本
- 使用 Javascript 从 Twitter 样本中读取内容