57 lines
1.4 KiB
JavaScript
57 lines
1.4 KiB
JavaScript
import { ref } from "vue"
|
|
import { message } from "ant-design-vue"
|
|
|
|
export function useRecording() {
|
|
const isRecording = ref(false)
|
|
const mediaRecorder = ref(null)
|
|
const audioChunks = ref([])
|
|
|
|
const startRecording = () => {
|
|
if (isRecording.value) return
|
|
|
|
navigator.mediaDevices
|
|
.getUserMedia({ audio: true })
|
|
.then((stream) => {
|
|
isRecording.value = true
|
|
audioChunks.value = []
|
|
|
|
mediaRecorder.value = new MediaRecorder(stream)
|
|
|
|
mediaRecorder.value.ondataavailable = (event) => {
|
|
audioChunks.value.push(event.data)
|
|
}
|
|
|
|
mediaRecorder.value.onstop = () => {
|
|
const audioBlob = new Blob(audioChunks.value, { type: "audio/wav" })
|
|
const audioUrl = URL.createObjectURL(audioBlob)
|
|
|
|
// 这里可以触发发送音频消息的事件
|
|
// 或者调用父组件的方法
|
|
|
|
// 停止所有音频轨道
|
|
stream.getTracks().forEach((track) => track.stop())
|
|
}
|
|
|
|
mediaRecorder.value.start()
|
|
})
|
|
.catch((error) => {
|
|
console.error("录音失败:", error)
|
|
message.error("无法访问麦克风,请检查权限设置")
|
|
isRecording.value = false
|
|
})
|
|
}
|
|
|
|
const stopRecording = () => {
|
|
if (!isRecording.value || !mediaRecorder.value) return
|
|
|
|
isRecording.value = false
|
|
mediaRecorder.value.stop()
|
|
}
|
|
|
|
return {
|
|
isRecording,
|
|
startRecording,
|
|
stopRecording,
|
|
}
|
|
}
|