UNPKG

use-audio-record

Version:
114 lines (110 loc) 3.15 kB
'use strict'; 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