html5录音功能实战示例

2020-04-24 19:07:58易采站长站整理

录音格式必须是mp3才能播放
window.URL.createObjectURL传入blob数据在pad端报错,转不了

以下为解决这两个问题的方案。

步骤3

以下为我实现 录音格式为mp3 和 window.URL.createObjectURL传入blob数据在pad端报错 的方案。

1、修改HZRecorder里的audioData对象代码。并引入网上一位大神的一个js文件lamejs.js


const lame = new lamejs();
let audioData = {
samplesMono: null,
maxSamples: 1152,
mp3Encoder: new lame.Mp3Encoder(1, context.sampleRate || 44100, config.bitRate || 128),
dataBuffer: [],
size: 0, // 录音文件长度
buffer: [], // 录音缓存
inputSampleRate: context.sampleRate, // 输入采样率
inputSampleBits: 16, // 输入采样数位 8, 16
outputSampleRate: config.sampleRate, // 输出采样率
oututSampleBits: config.sampleBits, // 输出采样数位 8, 16
convertBuffer: function(arrayBuffer) {
let data = new Float32Array(arrayBuffer);
let out = new Int16Array(arrayBuffer.length);
this.floatTo16BitPCM(data, out);
return out;
},
floatTo16BitPCM: function(input, output) {
for (let i = 0; i < input.length; i++) {
let s = Math.max(-1, Math.min(1, input[i]));
output[i] = s < 0 ? s * 0x8000 : s * 0x7fff;
}
},
appendToBuffer: function(mp3Buf) {
this.dataBuffer.push(new Int8Array(mp3Buf));
},
encode: function(arrayBuffer) {
this.samplesMono = this.convertBuffer(arrayBuffer);
let remaining = this.samplesMono.length;
for (let i = 0; remaining >= 0; i += this.maxSamples) {
let left = this.samplesMono.subarray(i, i + this.maxSamples);
let mp3buf = this.mp3Encoder.encodeBuffer(left);
this.appendToBuffer(mp3buf);
remaining -= this.maxSamples;
}
},
finish: function() {
this.appendToBuffer(this.mp3Encoder.flush());
return new Blob(this.dataBuffer, { type: 'audio/mp3' });
},
input: function(data) {
this.buffer.push(new Float32Array(data));
this.size += data.length;
},
compress: function() {
// 合并压缩
// 合并
let data = new Float32Array(this.size);
let offset = 0;
for (let i = 0; i < this.buffer.length; i++) {
data.set(this.buffer[i], offset);
offset += this.buffer[i].length;
}
// 压缩
let compression = parseInt(this.inputSampleRate / this.outputSampleRate, 10);
let length = data.length / compression;
let result = new Float32Array(length);
let index = 0;
let j = 0;
while (index < length) {
result[index] = data[j];
j += compression;
index++;
}
return result;
},
encodeWAV: function() {
let sampleRate = Math.min(this.inputSampleRate, this.outputSampleRate);
let sampleBits = Math.min(this.inputSampleBits, this.oututSampleBits);
let bytes = this.compress();
let dataLength = bytes.length * (sampleBits / 8);