stream-chat-react
Version:
React components to create chat conversations or livestream style chat
1 lines • 3.1 kB
Source Map (JSON)
{"version":3,"file":"mp3-encoder.mjs","names":[],"sources":["../../src/plugins/encoders/mp3.ts"],"sourcesContent":["import {\n renderAudio,\n toAudioBuffer,\n} from '../../components/MediaRecorder/transcode/audioProcessing';\n\nconst ENCODING_BIT_RATE = 128; // kbps;\nconst COUNT_SAMPLES_PER_ENCODED_BLOCK = 1152;\n\nconst float32ArrayToInt16Array = (float32Arr: Float32Array) => {\n const int16Arr = new Int16Array(float32Arr.length);\n for (let i = 0; i < float32Arr.length; i++) {\n const float32Value = float32Arr[i];\n // Clamp the float value between -1 and 1\n const clampedValue = Math.max(-1, Math.min(1, float32Value));\n // Convert the float value to a signed 16-bit integer\n int16Arr[i] = Math.round(clampedValue * 32767);\n }\n return int16Arr;\n};\n\nconst splitDataByChannel = (audioBuffer: AudioBuffer) =>\n Array.from({ length: audioBuffer.numberOfChannels }, (_, i) =>\n audioBuffer.getChannelData(i),\n ).map(float32ArrayToInt16Array);\n\nexport async function encodeToMp3(file: File, sampleRate: number) {\n const lameJs = await import('@breezystack/lamejs');\n const audioBuffer = await renderAudio(await toAudioBuffer(file), sampleRate);\n const channelCount = audioBuffer.numberOfChannels;\n const dataByChannel = splitDataByChannel(audioBuffer);\n const mp3Encoder = new lameJs.Mp3Encoder(channelCount, sampleRate, ENCODING_BIT_RATE);\n\n const dataBuffer: Int8Array[] = [];\n let remaining = dataByChannel[0].length;\n for (\n let i = 0;\n remaining >= COUNT_SAMPLES_PER_ENCODED_BLOCK;\n i += COUNT_SAMPLES_PER_ENCODED_BLOCK\n ) {\n const [leftChannelBlock, rightChannelBlock] = dataByChannel.map((channel) =>\n channel.subarray(i, i + COUNT_SAMPLES_PER_ENCODED_BLOCK),\n );\n dataBuffer.push(\n new Int8Array(mp3Encoder.encodeBuffer(leftChannelBlock, rightChannelBlock)),\n );\n remaining -= COUNT_SAMPLES_PER_ENCODED_BLOCK;\n }\n\n const lastBlock = mp3Encoder.flush();\n if (lastBlock.length) dataBuffer.push(new Int8Array(lastBlock));\n return new Blob(dataBuffer as BlobPart[], { type: 'audio/mp3;sbu_type=voice' });\n}\n"],"mappings":";;AAKA,IAAM,oBAAoB;AAC1B,IAAM,kCAAkC;AAExC,IAAM,4BAA4B,eAA6B;CAC7D,MAAM,WAAW,IAAI,WAAW,WAAW,MAAM;CACjD,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;EAC1C,MAAM,eAAe,WAAW;EAIhC,SAAS,KAAK,KAAK,MAFE,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,YAAY,CAEjC,IAAe,KAAK;CAC/C;CACA,OAAO;AACT;AAEA,IAAM,sBAAsB,gBAC1B,MAAM,KAAK,EAAE,QAAQ,YAAY,iBAAiB,IAAI,GAAG,MACvD,YAAY,eAAe,CAAC,CAC9B,EAAE,IAAI,wBAAwB;AAEhC,eAAsB,YAAY,MAAY,YAAoB;CAChE,MAAM,SAAS,MAAM,OAAO;CAC5B,MAAM,cAAc,MAAM,YAAY,MAAM,cAAc,IAAI,GAAG,UAAU;CAC3E,MAAM,eAAe,YAAY;CACjC,MAAM,gBAAgB,mBAAmB,WAAW;CACpD,MAAM,aAAa,IAAI,OAAO,WAAW,cAAc,YAAY,iBAAiB;CAEpF,MAAM,aAA0B,CAAC;CACjC,IAAI,YAAY,cAAc,GAAG;CACjC,KACE,IAAI,IAAI,GACR,aAAa,iCACb,KAAK,iCACL;EACA,MAAM,CAAC,kBAAkB,qBAAqB,cAAc,KAAK,YAC/D,QAAQ,SAAS,GAAG,IAAI,+BAA+B,CACzD;EACA,WAAW,KACT,IAAI,UAAU,WAAW,aAAa,kBAAkB,iBAAiB,CAAC,CAC5E;EACA,aAAa;CACf;CAEA,MAAM,YAAY,WAAW,MAAM;CACnC,IAAI,UAAU,QAAQ,WAAW,KAAK,IAAI,UAAU,SAAS,CAAC;CAC9D,OAAO,IAAI,KAAK,YAA0B,EAAE,MAAM,2BAA2B,CAAC;AAChF"}