Diffusers
MuseTalk1.5 / server /web /src /hooks /useMediaRecorder.js
Marcos
Add H.264 WebSocket streaming and React.js web interface
32bba92
Raw
History Blame Contribute Delete
1.69 kB
import { useState, useRef, useCallback } from 'react'
export function useMediaRecorder(onRecordingComplete) {
const [isRecording, setIsRecording] = useState(false)
const [error, setError] = useState(null)
const mediaRecorderRef = useRef(null)
const streamRef = useRef(null)
const chunksRef = useRef([])
const startRecording = useCallback(async () => {
try {
const stream = await navigator.mediaDevices.getUserMedia({ audio: true })
streamRef.current = stream
const mediaRecorder = new MediaRecorder(stream, {
mimeType: 'audio/webm;codecs=opus'
})
chunksRef.current = []
mediaRecorder.ondataavailable = (e) => {
if (e.data.size > 0) {
chunksRef.current.push(e.data)
}
}
mediaRecorder.onstop = async () => {
const audioBlob = new Blob(chunksRef.current, { type: 'audio/webm' })
const reader = new FileReader()
reader.onloadend = () => {
const base64 = reader.result.split(',')[1]
onRecordingComplete?.(base64)
}
reader.readAsDataURL(audioBlob)
streamRef.current?.getTracks().forEach(t => t.stop())
}
mediaRecorder.start()
mediaRecorderRef.current = mediaRecorder
setIsRecording(true)
setError(null)
} catch (e) {
console.error('[Mic] Error:', e)
setError('Permita acesso ao microfone')
}
}, [onRecordingComplete])
const stopRecording = useCallback(() => {
if (mediaRecorderRef.current && isRecording) {
mediaRecorderRef.current.stop()
setIsRecording(false)
}
}, [isRecording])
return { isRecording, error, startRecording, stopRecording }
}