use-audio-record
Version:
<!-- automd:badges color=yellow -->
112 lines (109 loc) • 3.1 kB
JavaScript
import { ref, watch } from 'vue';
import { g as getMimeType, S as SAMPLING_RATE, w as webmFixDuration } from './shared/use-audio-record.97f55604.mjs';
function useAudioRecorder(options = {}) {
const { mimeType = getMimeType(), sampleRate = SAMPLING_RATE } = options;
const stream = ref(null);
const mediaRecorder = ref(null);
const recording = ref(false);
const duration = ref(0);
const recordedBlob = ref(null);
const chunks = ref([]);
const initRecorder = async () => {
if (!stream.value) {
stream.value = await navigator.mediaDevices.getUserMedia({
audio: true,
video: false
});
}
};
const recordedAudioBuffer = 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 (getMimeType() === "audio/webm") {
blob = await 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);
}
};
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
};
}
export { useAudioRecorder };
//# sourceMappingURL=vue.mjs.map