| 
									
										
										
										
											2023-07-12 17:18:56 +08:00
										 |  |  | import lamejs from 'lamejs' | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  | import MPEGMode from 'lamejs/src/js/MPEGMode' | 
					
						
							|  |  |  | import Lame from 'lamejs/src/js/Lame' | 
					
						
							|  |  |  | import BitStream from 'lamejs/src/js/BitStream' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 14:53:52 +08:00
										 |  |  | if (globalThis) { | 
					
						
							|  |  |  |   (globalThis as any).MPEGMode = MPEGMode | 
					
						
							|  |  |  |   ;(globalThis as any).Lame = Lame | 
					
						
							|  |  |  |   ;(globalThis as any).BitStream = BitStream | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2023-07-12 17:18:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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' }) | 
					
						
							|  |  |  | } |