UNPKG

use-audio-record

Version:
1 lines 7.08 kB
{"version":3,"file":"react.mjs","sources":["../src/react.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react'\nimport { getMimeType } from './utils'\nimport { webmFixDuration } from './blob-fix'\nimport { SAMPLING_RATE } from './constants'\nimport { IOptions } from './types'\nexport function useAudioRecorder(options: IOptions = {}) {\n const { mimeType = getMimeType(), sampleRate = SAMPLING_RATE } = options\n const streamRef = useRef<MediaStream | null>(null)\n const mediaRecorderRef = useRef<MediaRecorder | null>(null)\n const chunksRef = useRef<Blob[]>([])\n const [recording, setRecording] = useState(false)\n const [duration, setDuration] = useState(0)\n const [recordedBlob, setRecordedBlob] = useState<Blob | null>(null)\n const initRecorder = async () => {\n if (!streamRef.current) {\n streamRef.current = await navigator.mediaDevices.getUserMedia({\n audio: true,\n })\n }\n }\n const [recordedAudioBuffer, setRecordedAudioBuffer] =\n useState<AudioBuffer | null>(null)\n const startRecording = async (completeCallback?: () => void) => {\n setRecordedBlob(null)\n const startTime = Date.now()\n try {\n if (!streamRef.current) {\n await initRecorder()\n }\n const mediaRecorder = new MediaRecorder(streamRef.current!, {\n mimeType,\n })\n mediaRecorderRef.current = mediaRecorder\n mediaRecorder.addEventListener('dataavailable', async (event) => {\n if (event.data.size > 0) {\n chunksRef.current.push(event.data)\n }\n if (mediaRecorder.state === 'inactive') {\n const duration = Date.now() - startTime\n let blob = new Blob(chunksRef.current, {\n type: mediaRecorder.mimeType,\n })\n if (getMimeType() === 'audio/webm') {\n blob = await webmFixDuration(blob, duration, blob.type)\n }\n setRecordedBlob(blob)\n if (!recordedBlob?.size) {\n return\n }\n const fileReader = new FileReader()\n fileReader.onloadend = async () => {\n const audioCTX = new AudioContext({\n sampleRate,\n })\n setRecordedAudioBuffer(\n await audioCTX.decodeAudioData(fileReader.result as ArrayBuffer),\n )\n completeCallback?.()\n }\n fileReader.readAsArrayBuffer(recordedBlob)\n chunksRef.current = []\n }\n })\n mediaRecorder.start()\n setRecording(true)\n } catch (error) {\n console.error('Error accessing microphone:', error)\n }\n }\n const stopRecording = () => {\n if (\n mediaRecorderRef.current &&\n mediaRecorderRef.current.state === 'recording'\n ) {\n mediaRecorderRef.current.stop() // set state to inactive\n setDuration(0)\n setRecording(false)\n }\n }\n\n useEffect(() => {\n const stream: MediaStream | null = null\n\n if (recording) {\n const timer = setInterval(() => {\n setDuration((prevDuration) => prevDuration + 1)\n }, 1000)\n\n return () => {\n clearInterval(timer)\n }\n }\n\n return () => {\n if (stream) {\n ;(stream as unknown as MediaStream)\n .getTracks()\n .forEach((track) => track.stop())\n }\n }\n }, [recording])\n const handleToggleRecording = (completeCallback?: () => void) => {\n if (recording) {\n stopRecording()\n } else {\n startRecording(completeCallback)\n }\n }\n return {\n streamRef,\n mediaRecorderRef,\n recording,\n duration,\n recordedBlob,\n recordedAudioBuffer,\n chunksRef,\n initRecorder,\n startRecording,\n stopRecording,\n handleToggleRecording,\n }\n}\n"],"names":["duration"],"mappings":"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"}