js实现发送语音消息
实现语音消息发送的步骤
录音功能实现
使用浏览器提供的MediaRecorder API进行录音。确保用户授权麦克风访问权限。
navigator.mediaDevices.getUserMedia({ audio: true })
.then(stream => {
const mediaRecorder = new MediaRecorder(stream);
let audioChunks = [];
mediaRecorder.ondataavailable = event => {
audioChunks.push(event.data);
};
mediaRecorder.onstop = () => {
const audioBlob = new Blob(audioChunks, { type: 'audio/wav' });
// 处理录音结果
};
});
录音控制 提供开始/停止录音的UI控制。典型实现需要按钮绑定事件:
// 开始录音
recordButton.addEventListener('click', () => {
mediaRecorder.start();
});
// 停止录音
stopButton.addEventListener('click', () => {
mediaRecorder.stop();
});
音频格式处理 将录音数据转换为可发送的格式。Web Audio API可用于进一步处理:
const audioContext = new AudioContext();
const source = audioContext.createBufferSource();
audioBlob.arrayBuffer().then(buffer => {
audioContext.decodeAudioData(buffer, decodedData => {
source.buffer = decodedData;
// 可进行降噪、标准化等处理
});
});
发送到服务器 使用FormData或二进制方式上传:
const formData = new FormData();
formData.append('voice', audioBlob, 'recording.wav');
fetch('/upload-voice', {
method: 'POST',
body: formData
}).then(response => {
// 处理服务器响应
});
兼容性处理方案
旧浏览器回退 检测API支持情况并提供替代方案:
if (!navigator.mediaDevices || !MediaRecorder) {
alert('您的浏览器不支持语音录制');
}
移动端适配 针对iOS/Android的特殊处理:
- 需要用户手势触发录音权限请求
- 注意自动播放策略限制
用户体验优化
可视化反馈 添加录音波形显示增强交互:
const analyser = audioContext.createAnalyser();
analyser.connect(audioContext.destination);
function visualize() {
const bufferLength = analyser.frequencyBinCount;
const dataArray = new Uint8Array(bufferLength);
analyser.getByteTimeDomainData(dataArray);
// 使用canvas绘制波形
requestAnimationFrame(visualize);
}
音频预览功能 发送前允许用户试听:
function playRecording(blob) {
const audioURL = URL.createObjectURL(blob);
const audio = new Audio(audioURL);
audio.play();
}
安全与权限
隐私提示 明确告知用户录音用途:
<dialog id="consentDialog">
<p>本功能需要访问麦克风,录音仅用于消息发送</p>
<button id="accept">同意</button>
</dialog>
服务器验证 后端应检查上传内容:
- 验证音频文件头信息
- 限制文件大小和时长
- 敏感词音频检测
完整实现示例
class VoiceRecorder {
constructor() {
this.mediaRecorder = null;
this.audioChunks = [];
}
async start() {
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
this.mediaRecorder = new MediaRecorder(stream);
this.mediaRecorder.ondataavailable = event => {
this.audioChunks.push(event.data);
};
this.mediaRecorder.start();
}
async stop() {
return new Promise(resolve => {
this.mediaRecorder.onstop = () => {
const audioBlob = new Blob(this.audioChunks, { type: 'audio/wav' });
resolve(audioBlob);
};
this.mediaRecorder.stop();
});
}
}
该实现涵盖从录音到发送的核心流程,实际应用中需根据具体需求调整格式处理、错误边界和UI交互细节。







