У меня очень странная проблема с API MediaRecorder, которую я не мог исправить последние два дня.
Этот упрощенный пример отлично работает: когда я нажимаю кнопку «Прекратить совместное использование» пользовательского интерфейса Chrome, все останавливается соответствующим образом:
desktopStream = await navigator.mediaDevices.getDisplayMedia({
video: true,
audio: true,
});
let rec = new MediaRecorder(desktopStream, {
mimeType: "video/webm; codecs=vp8,opus",
});
rec.onstop = async () => {
desktopStream.getTracks().forEach((s) => s.stop());
desktopStream = null;
//blobs.push(MediaRecorder.requestData());
blob = new Blob(blobs, {
type: "video/webm",
});
};
Однако это не так, он продолжает запись (или некоторые MediaTracks продолжают работать, не совсем уверен):
desktopStream = await navigator.mediaDevices.getDisplayMedia({
video: true,
audio: true,
});
voiceStream = await navigator.mediaDevices.getUserMedia({
video: false,
audio: true,
});
// this is the culprit, when commented everything works as expected
desktopStream.addTrack(voiceStream.getAudioTracks()[0]);
let rec = new MediaRecorder(desktopStream, {
mimeType: "video/webm; codecs=vp8,opus",
});
rec.onstop = async () => {
//explicitly stop tracks
desktopStream.getTracks().forEach((s) => s.stop();
voiceStream.getTracks().forEach((s) => s.stop());
desktopStream = null;
voiceStream = null;
//blobs.push(MediaRecorder.requestData());
blob = new Blob(blobs, {
type: "video/webm",
});
};
Второй блок кода приводит к тому, что хром по-прежнему показывает этот красный значок записи. Я много раз читал, что вам нужно останавливать треки вручную в цикле forEach, что я и делаю, но до этого никогда не доходит, функция Recorder.onstop, похоже, не вызывается.
Вот полный сценарий: https://jsfiddle.net/agcty/xhb0c4o3/19/
Действия по воспроизведению:
- Нажмите "Начать запись"
- Выбрать экран
- Сделайте что-нибудь в течение нескольких секунд
- Нажмите кнопку Chrome "Остановить совместный доступ", а не кнопку на скрипке.
- Красный значок записи по-прежнему будет отображаться, и вы не сможете загрузить запись, нажав «Загрузить».
- Нажмите «Остановить запись» (кнопка на скрипке), теперь запись правильно остановлена.
- Теперь прокомментируйте строку «desktopStream.addTrack (voiceStream.getAudioTracks () [0]);»
- Все работает