一些型号的iphone手机录音获取流stream延迟问题 以及 录音一次第二次不录音问题
- 延迟问题
javascript
navigator.mediaDevices.getUserMedia({ audio: true }) .then((stream) => {
console.log(stream)
})
从开始到获取stream会有将近2s的延迟 导致按下按钮开始录音 会有前面部分语音没录上 Safari 默认启用了音频回声消除和噪声抑制,这些处理可能会增加延迟。
默认的音频轨道配置可能不适配部分 iOS 设备
修改建议:禁用回声消除和噪声抑制 :通过 getUserMedia 的 audio 约束显式关闭这些
功能。
指定简单的音频轨道配置 。
javascript
navigator.mediaDevices.getUserMedia({
audio: {
echoCancellation: false,
noiseSuppression: false,
autoGainControl: false,
},
}) .then((stream) => {
console.log(stream)
})
- 第二次不录音问题
获取stream之后
javascript
// 检查 stream 是否有轨道
if (stream.getTracks().length === 0) {
console.error("流中没有轨道");
return;
}
// 获取音频轨道
const audioTrack = stream.getAudioTracks()[0];
if (audioTrack) {
console.log("音频轨道获取成功,轨道状态为:", audioTrack.readyState);
// 保存对音频轨道的引用
this.globalAudioTrack = audioTrack;
// 监听轨道结束事件
audioTrack.onended = () => {
console.log("音频轨道结束");
// 重新获取音频流
// this.requestAudioPermission();
// 这里可以根据需要重新获取流或者处理轨道结束的情况
};
// 如果需要,您可以在这里将流连接到HTML元素
// const audioElement = document.querySelector('audio');
// audioElement.srcObject = stream;
// 确保轨道是启用状态
audioTrack.enabled = true;
} else {
console.error("流中没有音频轨道");
}
停止录音后(// 清除对已停止轨道的引用)
javascript
stopAudioTrack() {
if (this.globalAudioTrack) {
this.globalAudioTrack.stop();
this.globalAudioTrack = null; // 清除对已停止轨道的引用
} else {
console.log("没有可关闭的音频轨道");
}
},