@@ -112,6 +112,32 @@ let mediaStream = null
|
||||
let chunks = []
|
||||
let timerHandle = null
|
||||
let timerStart = 0
|
||||
let recorderType = null
|
||||
|
||||
// The backend only accepts these extensions. Browsers can't record mp3/wav, but
|
||||
// most can record into an mp4 container (→ .m4a audio / .mp4 video), so prefer a
|
||||
// supported type whose extension the backend allows.
|
||||
const ACCEPTED_TYPES = {
|
||||
audio: [
|
||||
{ mime: 'audio/mp4', ext: 'm4a' },
|
||||
{ mime: 'audio/mpeg', ext: 'mp3' },
|
||||
{ mime: 'audio/wav', ext: 'wav' },
|
||||
],
|
||||
video: [
|
||||
{ mime: 'video/mp4', ext: 'mp4' },
|
||||
{ mime: 'video/webm', ext: 'webm' },
|
||||
],
|
||||
}
|
||||
|
||||
const pickRecorderType = (kind) => {
|
||||
const candidates = ACCEPTED_TYPES[kind] || []
|
||||
const supported = candidates.find((c) => window.MediaRecorder?.isTypeSupported?.(c.mime))
|
||||
if (supported) return supported
|
||||
// Last-resort fallbacks so recording still works even if extensions differ.
|
||||
return kind === 'video'
|
||||
? { mime: 'video/webm', ext: 'webm' }
|
||||
: { mime: 'audio/webm', ext: 'webm' }
|
||||
}
|
||||
|
||||
const hintText = computed(() =>
|
||||
props.kind === 'video' ? 'ویدیوی خود را ضبط کنید' : 'صدای خود را ضبط کنید'
|
||||
@@ -148,7 +174,8 @@ const onStart = async () => {
|
||||
liveEl.value.srcObject = mediaStream
|
||||
}
|
||||
chunks = []
|
||||
mediaRecorder = new window.MediaRecorder(mediaStream)
|
||||
recorderType = pickRecorderType(props.kind)
|
||||
mediaRecorder = new window.MediaRecorder(mediaStream, { mimeType: recorderType.mime })
|
||||
mediaRecorder.ondataavailable = (e) => {
|
||||
if (e.data?.size > 0) chunks.push(e.data)
|
||||
}
|
||||
@@ -176,9 +203,9 @@ const onStop = () => {
|
||||
const handleStop = async () => {
|
||||
isRecording.value = false
|
||||
stopTracks()
|
||||
const mime = props.kind === 'video' ? 'video/webm' : 'audio/webm'
|
||||
const mime = recorderType?.mime || mediaRecorder?.mimeType || 'audio/webm'
|
||||
const ext = recorderType?.ext || 'webm'
|
||||
const blob = new Blob(chunks, { type: mime })
|
||||
const ext = props.kind === 'video' ? 'webm' : 'webm'
|
||||
const file = new File([blob], `recording.${ext}`, { type: mime, lastModified: Date.now() })
|
||||
|
||||
if (previewUrl.value && previewUrl.value.startsWith('blob:')) {
|
||||
|
||||
Reference in New Issue
Block a user