基于webrtc浏览器截图

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


需求简介

网页上某个元素截图,截图后需要显示

一、原理

浏览器提供的navigator.mediaDevices.getDisplayMedia方法可以实现录屏功能,我们将它投放到video标签中进行播放,然后截取其中的一帧。video标签放在最底层藏起来(display不能设none),计算目标元素的位置进行截图

二、实现

1.在页面中最底层放一个video标签,大小需要设置成屏幕的宽高。
2.计算浏览器位置,获取点击事件的鼠标在屏幕中的位置,在获取鼠标在浏览器中的位置,计算出浏览器在屏幕中的位置。这一步主要考虑浏览器未全屏。
3.计算元素在浏览器中的位置,递归获取元素与父元素的距离然后相加,注意需要处理浏览器的任务栏、菜单栏。
4.截图,将屏幕投入video中截取一帧后关闭投屏。
5.其他后续操作

测试代码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
	</head>
	<body>
		<div style="width: 100%; height: 100%; position: relative; top: 0; left: 0; z-index: 1; overflow-y: hidden;">
			<video id="video" style="width: 1600; height: 900; position: absolute; top: 0; left: 0;" autoplay></video>
		</div>
		<div style="width: 100%; height: 100%; z-index: 2;">
			<button onclick="screenshoutBtnClick()">截图</button>
			<img id="showScreenShout" style="width: 320px; height: 200px;" />

			<div id="needScreenShotArea" style="width: 320px; height: 200px; background-color: aqua;">
				测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字
			</div>
		</div>
	</body>

	<script>
		function init() {
			if (window.screen) {
				var video = document.getElementById('video');
				video.style.width = window.screen.width + "px";
				video.style.height = window.screen.height + "px";
			}
		}

		init();

		const displayMediaOptions = {
			video: {
				cursor: "always"
			},
			audio: false
		};
		let videoElem = document.getElementById("video");

		function screenshoutBtnClick() {
			var windowX = event.screenX - event.clientX;
			var windowY = event.screenY - event.clientY;
			navigator.mediaDevices.getDisplayMedia(displayMediaOptions).then(stream => {
				videoElem.srcObject = stream;
				setTimeout(() => {
					var canvas = document.createElement("canvas");
					canvas.width = videoElem.clientWidth;
					canvas.height = videoElem.clientHeight;
					var needScreenShotEl = document.getElementById('needScreenShotArea');
					var pos = getPosition(needScreenShotEl);
					var toolBarHeight = window.outerHeight - window.innerHeight;
					canvas.getContext("2d").drawImage(videoElem, windowX + pos.left,
						windowY + (document.fullscreenElement ? pos.top : pos.top),
						needScreenShotEl.clientWidth, needScreenShotEl.clientHeight, 0, 0, canvas.width, canvas.height
					);
					var dataURL = canvas.toDataURL("image/png");
					document.getElementById('showScreenShout').src = dataURL;

					let tracks = videoElem.srcObject.getTracks();
					tracks.forEach(track => track.stop());
					videoElem.srcObject = null;
				}, 200)
			}).finally(() => {

			});
		}

		function getPosition(node) {
			//获取元素相对于其父元素的left值var left
			var left = node.offsetLeft;
			var top = node.offsetTop;
			// 取得元素的offsetParent
			current = node.offsetParent;

			// 一直循环直到根元素
			while (current != null) {
				left += current.offsetLeft;
				top += current.offsetTop;
				current = current.offsetParent;
			}
			return {
				"left": left,
				"top": top
			};
		}
	</script>
</html>

三、注意事项

1.浏览器安全策略

浏览器在https和localhost下才能无条件调用投屏,其它情况下需要设置白名单webrtc报错问题

2.元素位置计算

当前实现需要在屏幕100%显示下才能准确截取到目标元素,不是100%需要计算缩放

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于WebRTC的多人视频会议系统是一种通过Web浏览器实现的即时通讯系统。该系统允许多个用户通过互联网同时进行视频会议和实时交流,无需安装额外的软件或插件。 WebRTC基于一组实时通信协议,包括音视频传输、网络连接和通信控制等。通过利用WebRTC技术,系统可以实现低延迟的音视频传输和高质量的音视频通信,为用户提供更加沉浸式和真实的会议体验。 在多人视频会议系统中,用户可以通过浏览器访问系统网站,并通过输入会议号或邀请链接加入到会议中。系统会自动检测用户设备的音视频设备并进行配置,以确保用户在会议中能够正常进行音视频通信。 在会议中,用户可以选择开启或关闭自己的摄像头和麦克风,实现视频和音频的双向交流。系统会将用户的视频流实时传输给其他与会者,并显示其他与会者的视频流。此外,系统也提供文本聊天功能,方便用户进行实时的文字交流。 多人视频会议系统还允许用户共享屏幕,以便在会议中展示自己的电脑桌面、文档或应用程序。此外,系统还支持会议录制和回放功能,方便用户进行会议内容的保存和回顾。 基于WebRTC的多人视频会议系统提供了一个高效便捷的方式,让用户能够方便地进行远程会议和协作。无论是商业会议、在线培训还是团队协作,该系统都能满足用户的实时通信需求,并提供良好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值