mirror of
https://github.com/kevin-DL/vue-audio-recorder.git
synced 2026-01-11 19:04:28 +00:00
50 lines
1.3 KiB
JavaScript
50 lines
1.3 KiB
JavaScript
import { Mp3Encoder } from 'lamejs'
|
|
|
|
export default class {
|
|
constructor(config) {
|
|
this.bitRate = config.bitRate
|
|
this.sampleRate = config.sampleRate
|
|
this.dataBuffer = []
|
|
this.encoder = new Mp3Encoder(1, this.sampleRate, this.bitRate)
|
|
}
|
|
|
|
encode(arrayBuffer) {
|
|
const maxSamples = 1152
|
|
const samples = this._convertBuffer(arrayBuffer)
|
|
let remaining = samples.length
|
|
|
|
for (let i = 0; remaining >= 0; i += maxSamples) {
|
|
const left = samples.subarray(i, i + maxSamples)
|
|
const buffer = this.encoder.encodeBuffer(left)
|
|
this.dataBuffer.push(new Int8Array(buffer))
|
|
remaining -= maxSamples
|
|
}
|
|
}
|
|
|
|
finish() {
|
|
this.dataBuffer.push(this.encoder.flush())
|
|
const blob = new Blob(this.dataBuffer, { type: 'audio/mp3' })
|
|
this.dataBuffer = []
|
|
|
|
return {
|
|
id : Date.now(),
|
|
blob : blob,
|
|
url : URL.createObjectURL(blob)
|
|
}
|
|
}
|
|
|
|
_floatTo16BitPCM(input, output) {
|
|
for (let i = 0; i < input.length; i++) {
|
|
const s = Math.max(-1, Math.min(1, input[i]))
|
|
output[i] = (s < 0 ? s * 0x8000 : s * 0x7FFF)
|
|
}
|
|
}
|
|
|
|
_convertBuffer(arrayBuffer) {
|
|
const data = new Float32Array(arrayBuffer)
|
|
const out = new Int16Array(arrayBuffer.length)
|
|
this._floatTo16BitPCM(data, out)
|
|
return out
|
|
}
|
|
}
|