utils.ts 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import lamejs from 'lamejs'
  2. export const convertToMp3 = (recorder: any) => {
  3. const wav = lamejs.WavHeader.readHeader(recorder.getWAV())
  4. const { channels, sampleRate } = wav
  5. const mp3enc = new lamejs.Mp3Encoder(channels, sampleRate, 128)
  6. const result = recorder.getChannelData()
  7. const buffer = []
  8. const leftData = result.left && new Int16Array(result.left.buffer, 0, result.left.byteLength / 2)
  9. const rightData = result.right && new Int16Array(result.right.buffer, 0, result.right.byteLength / 2)
  10. const remaining = leftData.length + (rightData ? rightData.length : 0)
  11. const maxSamples = 1152
  12. for (let i = 0; i < remaining; i += maxSamples) {
  13. const left = leftData.subarray(i, i + maxSamples)
  14. let right = null
  15. let mp3buf = null
  16. if (channels === 2) {
  17. right = rightData.subarray(i, i + maxSamples)
  18. mp3buf = mp3enc.encodeBuffer(left, right)
  19. }
  20. else {
  21. mp3buf = mp3enc.encodeBuffer(left)
  22. }
  23. if (mp3buf.length > 0)
  24. buffer.push(mp3buf)
  25. }
  26. const enc = mp3enc.flush()
  27. if (enc.length > 0)
  28. buffer.push(enc)
  29. return new Blob(buffer, { type: 'audio/mp3' })
  30. }