|
import lamejs from 'lamejs' |
|
import MPEGMode from 'lamejs/src/js/MPEGMode' |
|
import Lame from 'lamejs/src/js/Lame' |
|
import BitStream from 'lamejs/src/js/BitStream' |
|
|
|
if (globalThis) { |
|
(globalThis as any).MPEGMode = MPEGMode |
|
;(globalThis as any).Lame = Lame |
|
;(globalThis as any).BitStream = BitStream |
|
} |
|
|
|
export const convertToMp3 = (recorder: any) => { |
|
const wav = lamejs.WavHeader.readHeader(recorder.getWAV()) |
|
const { channels, sampleRate } = wav |
|
const mp3enc = new lamejs.Mp3Encoder(channels, sampleRate, 128) |
|
const result = recorder.getChannelData() |
|
const buffer = [] |
|
|
|
const leftData = result.left && new Int16Array(result.left.buffer, 0, result.left.byteLength / 2) |
|
const rightData = result.right && new Int16Array(result.right.buffer, 0, result.right.byteLength / 2) |
|
const remaining = leftData.length + (rightData ? rightData.length : 0) |
|
|
|
const maxSamples = 1152 |
|
for (let i = 0; i < remaining; i += maxSamples) { |
|
const left = leftData.subarray(i, i + maxSamples) |
|
let right = null |
|
let mp3buf = null |
|
|
|
if (channels === 2) { |
|
right = rightData.subarray(i, i + maxSamples) |
|
mp3buf = mp3enc.encodeBuffer(left, right) |
|
} |
|
else { |
|
mp3buf = mp3enc.encodeBuffer(left) |
|
} |
|
|
|
if (mp3buf.length > 0) |
|
buffer.push(mp3buf) |
|
} |
|
|
|
const enc = mp3enc.flush() |
|
|
|
if (enc.length > 0) |
|
buffer.push(enc) |
|
|
|
return new Blob(buffer, { type: 'audio/mp3' }) |
|
} |
|
|