use-audio-record
Version:
<!-- automd:badges color=yellow -->
114 lines (110 loc) • 3.15 kB
JavaScript
;
const vue = require('vue');
const constants = require('./shared/use-audio-record.c8adf376.cjs');
function useAudioRecorder(options = {}) {
const { mimeType = constants.getMimeType(), sampleRate = constants.SAMPLING_RATE } = options;
const stream = vue.ref(null);
const mediaRecorder = vue.ref(null);
const recording = vue.ref(false);
const duration = vue.ref(0);
const recordedBlob = vue.ref(null);
const chunks = vue.ref([]);
const initRecorder = async () => {
if (!stream.value) {
stream.value = await navigator.mediaDevices.getUserMedia({
audio: true,
video: false
});
}
};
const recordedAudioBuffer = vue.ref();
const startRecording = async (completeCallback) => {
recordedBlob.value = null;
const startTime = Date.now();
try {
if (!stream.value) {
await initRecorder();
}
mediaRecorder.value = new MediaRecorder(stream.value, {
mimeType
});
mediaRecorder.value?.addEventListener("dataavailable", async (event) => {
if (event.data.size > 0) {
chunks.value.push(event.data);
}
if (mediaRecorder.value.state === "inactive") {
const duration2 = Date.now() - startTime;
let blob = new Blob(chunks.value, {
type: mediaRecorder.value.mimeType
});
if (constants.getMimeType() === "audio/webm") {
blob = await constants.webmFixDuration(blob, duration2, blob.type);
}
recordedBlob.value = blob;
if (!recordedBlob.value?.size) {
return;
}
const fileReader = new FileReader();
fileReader.onloadend = async () => {
const audioCTX = new AudioContext({
sampleRate
});
recordedAudioBuffer.value = await audioCTX.decodeAudioData(
fileReader.result
);
completeCallback?.();
};
fileReader.readAsArrayBuffer(recordedBlob.value);
chunks.value = [];
}
});
mediaRecorder.value.start();
recording.value = true;
} catch (error) {
console.error("Error accessing microphone:", error);
}
};
const stopRecording = () => {
if (mediaRecorder.value?.state === "recording") {
mediaRecorder.value.stop();
}
recording.value = false;
duration.value = 0;
};
const handleToggleRecording = (completeCallback) => {
if (recording) {
stopRecording();
} else {
startRecording(completeCallback);
}
};
vue.watch(recording, (val) => {
if (val) {
const timer = setInterval(() => {
duration.value = duration.value + 1;
}, 1e3);
return () => {
clearInterval(timer);
};
}
return () => {
};
});
return {
mimeType,
sampleRate,
stream,
mediaRecorder,
recording,
duration,
recordedBlob,
recordedAudioBuffer,
chunks,
initRecorder,
startRecording,
stopRecording,
handleToggleRecording
};
}
exports.useAudioRecorder = useAudioRecorder;
//# sourceMappingURL=vue.cjs.map