stream-chat-react
Version:
React components to create chat conversations or livestream style chat
34 lines (33 loc) • 1.74 kB
JavaScript
import { n as toAudioBuffer, t as renderAudio } from "./audioProcessing.766ca76c.mjs";
//#region src/plugins/encoders/mp3.ts
var ENCODING_BIT_RATE = 128;
var COUNT_SAMPLES_PER_ENCODED_BLOCK = 1152;
var float32ArrayToInt16Array = (float32Arr) => {
const int16Arr = new Int16Array(float32Arr.length);
for (let i = 0; i < float32Arr.length; i++) {
const float32Value = float32Arr[i];
int16Arr[i] = Math.round(Math.max(-1, Math.min(1, float32Value)) * 32767);
}
return int16Arr;
};
var splitDataByChannel = (audioBuffer) => Array.from({ length: audioBuffer.numberOfChannels }, (_, i) => audioBuffer.getChannelData(i)).map(float32ArrayToInt16Array);
async function encodeToMp3(file, sampleRate) {
const lameJs = await import("@breezystack/lamejs");
const audioBuffer = await renderAudio(await toAudioBuffer(file), sampleRate);
const channelCount = audioBuffer.numberOfChannels;
const dataByChannel = splitDataByChannel(audioBuffer);
const mp3Encoder = new lameJs.Mp3Encoder(channelCount, sampleRate, ENCODING_BIT_RATE);
const dataBuffer = [];
let remaining = dataByChannel[0].length;
for (let i = 0; remaining >= COUNT_SAMPLES_PER_ENCODED_BLOCK; i += COUNT_SAMPLES_PER_ENCODED_BLOCK) {
const [leftChannelBlock, rightChannelBlock] = dataByChannel.map((channel) => channel.subarray(i, i + COUNT_SAMPLES_PER_ENCODED_BLOCK));
dataBuffer.push(new Int8Array(mp3Encoder.encodeBuffer(leftChannelBlock, rightChannelBlock)));
remaining -= COUNT_SAMPLES_PER_ENCODED_BLOCK;
}
const lastBlock = mp3Encoder.flush();
if (lastBlock.length) dataBuffer.push(new Int8Array(lastBlock));
return new Blob(dataBuffer, { type: "audio/mp3;sbu_type=voice" });
}
//#endregion
export { encodeToMp3 };
//# sourceMappingURL=mp3-encoder.mjs.map