Для совместного использования вкладок, окон и экранов на веб-платформе используется Screen Capture API (API захвата экрана).
Метод getDisplayMedia() позволяет пользователю выбрать экран для захвата в качестве медиапотока. Затем этот поток можно записать с помощью MediaRecorder API или поделиться им с другими пользователями по сети. Запись можно сохранить в локальный файл с помощью метода showOpenFilePicker().
В приведенном ниже примере показано, как вы можете записать экран пользователя в формате WebM, выполнить локальный предпросмотр на той же странице и сохранить запись в файловой системе пользователя.
HTML-код:
<button id="startShareScreenButton">
Поделиться экраном
</button>
<button disabled id="stopShareScreenButton">
Закрыть доступ
</button>
<button disabled id="startRecordButton">
Начать запись
</button>
<button disabled id="stopRecordButton">
Остановить запись
</button>
<figure>
<video
autoplay
muted
playsinline></video>
</figure>
Javascript:
let stream;
let recorder;
shareScreenButton.addEventListener(
"click",
async () => {
// Предложение пользователю
// поделиться своим экраном.
stream =
await navigator.mediaDevices.getDisplayMedia();
recorder = new MediaRecorder(stream);
// Локальный предпросмотр экрана.
video.srcObject = stream;
});
stopShareScreenButton.addEventListener(
"click",
() => {
// Остановить поток
stream.getTracks().forEach(
track => track.stop()
);
video.srcObject = null;
});
startRecordButton.addEventListener(
"click",
async () => {
// Для понимания кода в этом примере
// используется только
// метод `showSaveFilePicker()`.
// О том, что делать для браузеров,
// которые не поддерживают
// этот метод, можно посмотреть здесь
// https://web.dev/patterns/files/save-a-file/.
// Предложить пользователю выбрать,
// где сохранять файл с записью.
const suggestedName = "screen-recording.webm";
const handle = await window.showSaveFilePicker(
{ suggestedName }
);
const writable = await handle.createWritable();
// Начать запись экрана
recorder.start();
recorder.addEventListener(
"dataavailable",
async (event) => {
// Запись фрагментов в файл
await writable.write(event.data);
if (recorder.state === "inactive") {
// Закрыть файл,
// когда запись остановится
await writable.close();
}
});
});
stopRecordButton.addEventListener(
"click",
() => {
// Остановить запись экрана
recorder.stop();
});
Пример захвата экрана с записью видео: