稳定测试版

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

Loading…
Cancel
Save