I have a task play some audio tracks, then record user voice and send it to server as 1 second chunks. Both of this actions repeat is in loop. In other words, something like a dialogue.
Sometimes the recorder stops hearing the user, although recording is in progress (ondataavailable continues firing). And after about 10 seconds an error appears in the console:
A MediaStreamTrack ended due to a capture failure
Player:
const audio = new Audio();
audio.loop = false;
const playAudio = (base64: string) =>
new Promise((resolve, reject) => {
audio.onended = resolve;
audio.onerror = reject;
audio.src = base64;
audio.play().catch(reject);
});
Recorder:
import { IMediaRecorder, MediaRecorder, register, } from 'extendable-media-recorder';
import { connect } from 'extendable-media-recorder-wav-encoder';
let mediaRecorder: IMediaRecorder;
navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true } })
.then(stream => (mediaRecorder = new MediaRecorder(stream, { mimeType: 'audio/wav' })));
export const start = async (listener: (buffer: Blob) => void) => {
stop();
mediaRecorder?.ondataavailable = ({ data }) => listener(blob);
mediaRecorder?.start(1000);
};
export const stop = () => isInited && mediaRecorder?.stop();
This error is observed mainly on iOS