稳定测试版

main
wang 1 month ago
parent f546ce7031
commit d8833c9193

File diff suppressed because one or more lines are too long

@ -606,86 +606,47 @@ export default {
//
const startRecording = async () => {
try {
//
const stream = await navigator.mediaDevices.getUserMedia({
audio: {
echoCancellation: true,
noiseSuppression: true,
autoGainControl: true
}
})
//
let options = {};
let mimeType = '';
});
//
let mimeType = 'audio/webm';
if (MediaRecorder.isTypeSupported('audio/webm;codecs=opus')) {
mimeType = 'audio/webm;codecs=opus';
console.log('使用 audio/webm;codecs=opus 格式录音');
}
else if (MediaRecorder.isTypeSupported('audio/webm')) {
mimeType = 'audio/webm';
console.log('使用 audio/webm 格式录音');
}
else if (MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')) {
mimeType = 'audio/ogg;codecs=opus';
console.log('使用 audio/ogg;codecs=opus 格式录音');
}
else if (MediaRecorder.isTypeSupported('audio/mp4')) {
mimeType = 'audio/mp4';
console.log('使用 audio/mp4 格式录音');
}
else {
console.log('使用默认音频格式录音');
}
//
if (mimeType) {
options = {
mimeType: mimeType,
audioBitsPerSecond: 32000 //
};
}
const options = {
mimeType: mimeType,
audioBitsPerSecond: 32000
};
//
mediaRecorder.value = new MediaRecorder(stream, options)
audioChunks.value = []
mediaRecorder.value = new MediaRecorder(stream, options);
audioChunks.value = [];
//
recordingStartTime.value = Date.now()
recordingDuration.value = 0
recordingStartTime.value = Date.now();
//
mediaRecorder.value.addEventListener('dataavailable', event => {
if (event.data.size > 0) {
audioChunks.value.push(event.data)
audioChunks.value.push(event.data);
}
})
});
//
mediaRecorder.value.addEventListener('stop', () => {
//
if (audioChunks.value.length === 0 || !isRecording.value) {
isRecording.value = false
recordingDuration.value = 0
stopMediaTracks(stream)
return
const actualDuration = (Date.now() - recordingStartTime.value) / 1000;
if (audioChunks.value.length === 0 || actualDuration < 0.5) {
stopMediaTracks(stream);
return;
}
//
const actualDuration = (Date.now() - recordingStartTime.value) / 1000
console.log('录音实际时长:', actualDuration, '秒')
// Blob
const audioBlob = new Blob(audioChunks.value, { type: mimeType || 'audio/webm' })
//
const tempId = 'temp-' + Date.now()
const localAudioUrl = URL.createObjectURL(audioBlob)
const audioBlob = new Blob(audioChunks.value, { type: mimeType });
const localAudioUrl = URL.createObjectURL(audioBlob);
messages.value.push({
id: tempId,
id: `temp-${Date.now()}`,
user_id: currentUser.id,
username: currentUser.username,
message: localAudioUrl,
@ -693,81 +654,58 @@ export default {
audio_duration: actualDuration,
created_at: new Date().toISOString(),
isLocal: true
})
scrollToBottom()
});
scrollToBottom();
// BlobBase64
const reader = new FileReader()
reader.readAsDataURL(audioBlob)
const reader = new FileReader();
reader.readAsDataURL(audioBlob);
reader.onloadend = () => {
const base64Audio = reader.result
console.log('音频格式:', mimeType || 'unknown', '数据前缀:', base64Audio.substring(0, 50))
//
const base64Audio = reader.result;
socket.emit('send_audio_message', {
room_id: currentRoom.value.id,
audio_data: base64Audio,
audio_duration: actualDuration,
audio_mime_type: mimeType || 'audio/webm'
})
//
isRecording.value = false
recordingDuration.value = 0
recordingStartTime.value = null
}
audio_mime_type: mimeType
});
};
//
stopMediaTracks(stream)
})
stopMediaTracks(stream);
});
// 便
mediaRecorder.value.start(100)
isRecording.value = true
mediaRecorder.value.start(100);
isRecording.value = true;
// -
recordingDuration.value = 0; // Reset duration display
recordingTimer.value = setInterval(() => {
// 使
recordingDuration.value = (Date.now() - recordingStartTime.value) / 1000
// 60
recordingDuration.value = (Date.now() - recordingStartTime.value) / 1000;
if (recordingDuration.value >= 60) {
stopRecording()
stopRecording();
}
}, 100) // 100ms使
}, 100);
} catch (err) {
console.error('无法访问麦克风:', err)
alert('无法访问麦克风,请检查浏览器权限设置。')
console.error('无法访问麦克风:', err);
alert('无法访问麦克风,请检查浏览器权限设置。');
}
}
//
};
// toggleRecording
const toggleRecording = () => {
if (isRecording.value) {
stopRecording()
stopRecording();
} else {
startRecording()
startRecording();
}
}
//
const stopRecording = (forceStop = false) => {
};
const stopRecording = () => {
if (mediaRecorder.value && isRecording.value) {
mediaRecorder.value.stop()
isRecording.value = false
mediaRecorder.value.stop();
isRecording.value = false;
if (recordingTimer.value) {
clearInterval(recordingTimer.value)
}
//
if (!forceStop) {
// onstop
} else {
audioChunks.value = [] //
clearInterval(recordingTimer.value);
}
}
}
};
//
const playAudio = (message) => {

Loading…
Cancel
Save