UNPKG

use-audio-record

Version:
112 lines (109 loc) 3.1 kB
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