Screen recorde
html
JavaScript
<video id="video" height="400" autoplay></video>
<button id="toggle">toggle capture</button>
<button id="togglerec">toggle recorde</button>
<script>
(async () => {
let capture = false;
const videoElem = document.querySelector("#video");
async function toggleCapture(event) {
if (capture) {
videoElem.srcObject.getTracks().forEach((track) => track.stop());
videoElem.srcObject = null;
capture = false;
} else {
try {
let captureStream = await navigator.mediaDevices.getDisplayMedia({
video: {
cursor: "never",
},
audio: true,
});
videoElem.srcObject = captureStream;
// Recorde
let rec = new MediaRecorder(captureStream);
let fileWritableStream;
let handleFile;
async function saveChunk(event) {
let blob = new Blob([event.data], {
type: 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"',
});
await fileWritableStream.write(blob);
}
rec.addEventListener("start", async function (event) {
rec.addEventListener("dataavailable", saveChunk);
fileWritableStream = await handleFile.createWritable();
});
rec.addEventListener("stop", async function (event) {
rec.removeEventListener("dataavailable", saveChunk);
await fileWritableStream.close();
});
async function toggleRec(event) {
if (rec.state == "recording") rec.stop();
else {
handleFile = await window.showSaveFilePicker();
rec.start(1000 /* One seconde */);
}
}
document
.querySelector("#togglerec")
.addEventListener("click", toggleRec, false);
// Dump debug
for (const track of videoElem.srcObject.getVideoTracks()) {
console.info("Track");
console.info(track);
console.info("Track settings:");
console.info(JSON.stringify(track.getSettings(), null, 2));
console.info("Track constraints:");
console.info(JSON.stringify(track.getConstraints(), null, 2));
}
} catch (err) {
console.error("Error: " + err);
}
capture = true;
}
}
document
.querySelector("#toggle")
.addEventListener("click", toggleCapture, false);
})();
</script>