已封装为工具函数,选定元素绑定该函数,就可以添加录屏功能
/**
* @description 用法:对dom元素添加监听事件绑定为getRecorderVideo(),即可调用
* @param playVideoIdName 可选参数,用于绑定在哪个节点预览录屏的视屏,不传则不预览
*/
export const getRecorderVideo = async (playVideoIdName) => {
let stream = await navigator.mediaDevices.getDisplayMedia({
video: true,
});
const mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9")
? "video/webm; codecs=vp9"
: "video/webm";
// 浏览器录屏对象
let mediaRecorder = new MediaRecorder(stream, {
mimeType: mime,
});
let chunks = [];
// 记录屏幕渲染数据
mediaRecorder.addEventListener("dataavailable", function (e) {
chunks.push(e.data);
});
// 保存录屏数据
mediaRecorder.addEventListener("stop", function () {
let blob = new Blob(chunks, {
type: chunks[0].type,
});
let videoUrl = URL.createObjectURL(blob);
// 绑定播放视频Dom对象,
const playVideo = (name) => {
if (name != undefined && typeof name == "string") {
const videoBox = document.getElementById(`${name}`);
// 创建Video节点对象
const newVideo = document.createElement("video");
newVideo.src = videoUrl;
newVideo.style.height = "200px";
newVideo.style.width = "200px";
newVideo.setAttribute("class", "playRecorderVideoDom");
const oldVideo = videoBox
.getElementsByClassName("playRecorderVideoDom")
.item(0);
// 非第一次操作,替换节点即可
if (!oldVideo) {
videoBox.appendChild(newVideo);
} else {
videoBox.replaceChild(newVideo, oldVideo);
}
} else {
console.log("不播放视频");
}
};
// 下载录屏视频文件
const downloadVideo = (url, videoName) => {
let a = document.createElement("a");
a.href = url;
a.download = `${videoName}.webm`;
a.click();
};
downloadVideo(videoUrl, "录屏文件");
playVideo(playVideoIdName);
});
// 手动启动 录屏
mediaRecorder.start();
};