utils.ts 1.3 KB

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