注释: 我这边是读取的本地文件的采样频率,采样精度等参数,框架用的是vue。话不多说直接上代码。
1. 将input:file获取到的文件转换为url
// --- 将文件转换为可读url链接
// --- file:本地读取的文件对象
getObjectURL(file) {
var url = null;
if (window.createObjectURL != undefined) {
// basic
url = window.createObjectURL(file);
} else if (window.URL != undefined) {
// mozilla(firefox)
url = window.URL.createObjectURL(file);
} else if (window.webkitURL != undefined) {
// webkit or chrome
url = window.webkitURL.createObjectURL(file);
}
return url;
}
2. 使用fetch读取文件,在解析需要的数据
// --- 音频处理
async handleVideo(file) {
//也可以使用错误处理
try {
let url = this.getObjectURL(file.file);
const res = await fetch(url);
const arrayBuffer = await res.arrayBuffer(); // byte array字节数组
let intArr = new Int8Array(arrayBuffer);
let channelArr = intArr.slice(22, 24);
let codeArr = intArr.slice(20, 22);
let sampleRateArr = intArr.slice(24, 28);
let bitPerSampleArr = intArr.slice(34, 36);
let type = String.fromCharCode.apply(null, intArr.slice(8, 16));
let numberOfChannels =
(channelArr[0] & 0xff) | ((channelArr[1] & 0xff) << 8);
let code = (codeArr[0] & 0xff) | ((codeArr[1] & 0xff) << 8);
let sampleRate =
(sampleRateArr[0] & 0xff) |
((sampleRateArr[1] & 0xff) << 8) |
((sampleRateArr[2] & 0xff) << 16) |
((sampleRateArr[3] & 0xff) << 24);
let bitPerSample =
(bitPerSampleArr[0] & 0xff) | ((bitPerSampleArr[1] & 0xff) << 8);
// 不可删除提示消息 ------
console.log(
"格式:" +
type +
" 声道数:" +
numberOfChannels +
" 编码:" +
code +
" 采样率:" +
sampleRate +
" 采样位数:" +
bitPerSample
);
} catch (e) {
console.log(e);
}
}