WebRTC(五) Web端实现屏幕录制

1 完成html代码

<html>
	<head>
		<title>WebRTC capture video and audio</title>
		<style>
		//==============   切换视频效果   ==================
			.none{
				-webkit-filter:none;
			}

			.blur{
				-webkit-filter:blur(3px);
			}
			.grayscale{
				-webkit-filter:grayscale(1);
			}
			.invert{
				-webkit-filter:invert(1);
			}
			.sepia {
				-webkit-filter:sepia(1);
			}
		</style>
	</head>
	<body>
		==============   用于显示和选择设备   ==================
		<div>
			 <label>audio input device:</label>
             <select id = "audioSource"></select>
		</div>
		<div>
			<label>audio output device:</label>
			<select id = "audioOutput"></select>
		</div>	
		<div>
			<label>video input device:</label>
			<select id = "videoSource"></select>
		</div>
		==============   视频效果选择   ==================
		<div>
			<label>Filter:</label>
			<select id = "filter">
				<option value = "none">None</option>
				<option value = "blur">模糊</option>
				<option value = "grayscale">灰度</option>
				<option value = "invert">反色</option>
				<option value = "sepia">褐色</option>
			</select>
		</div>
		==============   显示视频图像   ==================
		<selection>
			<!--autoplay 表示一进来就播放 controls表示显示播放的按钮-->
			<!--<audio autoplay controls id = 'audioplayer'></audio>-->
			<table>
				<tr>
					<td><video autoplay playsinline id = "player"></video></td>
					<td><video playsinline id = "recplayer"></video></td>
					<td> <div id = 'constraints' class = 'output'></div></td>
				</tr>
				<tr>
					<td> <button id = "record">Start Record</button></td>
					<td> <button id = "recplay" disabled>Play</button></td>
					<td> <button id = "download" disabled>Download</button></td>
				</tr>
			</table>
			
		</selection>

		<div>
			<button id = "snapshort">截取快照</button>
		</div>
		<div>
			<canvas id = "picture">截取快照</canvas>
		</div>

		==============   js   ==================
		<script src = "./client.js"></script>
		<script src = "https://webrtc.github.io/adapter/adapter-latest.js"></script>
	</body>
</html>

切换视频效果是对视频进行一些模糊或者滤镜处理例如褐色处理:
在这里插入图片描述

2 完整JS代码

'use strict'

var audioSource = document.querySelector('select#audioSource');
var audioOutput = document.querySelector('select#audioOutput');
var videoSource = document.querySelector('select#videoSource');

//视频效果标签
var filtersSelect = document.querySelector('select#filter');

//用于拍照的btn和显示截取快照的图片
var snapshort = document.querySelector('button#snapshort');
var picture = document.querySelector('canvas#picture');
picture.width = 320;
picture.height = 240;

//用于显示视频流参数信息
var divConstraints = document.querySelector('div#constraints');

//获取到video标签
var videoplay = document.querySelector('video#player');
//var audioplay = document.querySelector('audio#audioplayer');

//录制相关
var recvideo = document.querySelector('video#recplayer');
var btnRecord = document.querySelector('button#record');
var btnPlay = document.querySelector('button#recplay');
var btnDownload = document.querySelector('button#download');

var buffer;
var mediaRecorder;

//将流赋值给video标签
function gotMediaStream(stream){
	videoplay.srcObject = stream;
	//audioplay.srcObject = stream;

	//视频的所有轨
	var videoTrack = stream.getVideoTracks()[0];
	var videoConstraints = videoTrack.getSettings();

	divConstraints.textContent = JSON.stringify(videoConstraints, null, 2);
	window.stream = stream;
	return navigator.mediaDevices.enumerateDevices();
}

//打印错误日志
function handleError(err){
	console.log('getUserMedia error : ', err);
}

//设备信息数组
function gotDevices(deviceInfos){

	deviceInfos.forEach(function(deviceinfo){
		var option = document.createElement('option');
		option.text = deviceinfo.label;
		option.value = deviceinfo.deviceId;

		if(deviceinfo.kind == 'audioinput'){
				audioSource.appendChild(option);
		}else if(deviceinfo.kind === 'audiooutput'){
				audioOutput.appendChild(option);
		}else if(deviceinfo.kind === 'videoinput'){
				videoSource.appendChild(option);
		}
	})
}

function start(){

	if(!navigator.mediaDevices || !navigator.mediaDevices.getDisplayMedia){
		console.log('getUserMedia is not supported');
		return;
	}else{
		var deviceId = videoSource.value;
		var constraints = {
			 video : {
				//修改视频宽高
				width : 320,
				height : 240,

				//设置帧率
				frameRate : 15,
				facingMode : 'enviroment',
				deviceId : deviceId ? {exact:deviceId} : undefined
			}, 
			audio : false
		}

		navigator.mediaDevices.getDisplayMedia(constraints)
		.then(gotMediaStream)
		.then(gotDevices)
		.catch(handleError)
	}

} 

start();


//每次选择时,都会触发start函数
videoSource.onchange = start

filtersSelect.onchange = function(){
	//获取css名字
	videoplay.className = filtersSelect.value;
}

//截取快照事件
snapshort.onclick = function(){
	picture.className = filtersSelect.value;
	picture.getContext('2d').drawImage(videoplay, 0,0, picture.width,picture.height);
}

function handleDataAvailable(e){
	if(e && e.data && e.data.size > 0){
		buffer.push(e.data);
	}
}

function startRecord(){
	buffer = [];
	var options = {
		mimeType : 'video/webm; codecs = vp8'
	}

	if(!MediaRecorder.isTypeSupported(options.mimeType)){
			console.error('${options.mimeType} is not supported!');
			return;
	}

	try{
		mediaRecorder = new MediaRecorder(window.stream, options);
	}catch(e){
		console.error('Failed to create MediaRecorder:',e);
		return
	}
	mediaRecorder.ondataavailable = handleDataAvailable;
	mediaRecorder.start(10);
}

function stopRecord(){
	mediaRecorder.stop();
}

//录制按钮监听
btnRecord.onclick = ()=>{
	if(btnRecord.textContent === 'Start Record'){
		startRecord();
		btnRecord.textContent = 'Stop Record';
		btnPlay.disabled = true;
		btnDownload.disabled = true;
	}else{
		stopRecord();
		btnRecord.textContent = 'Start Record';
		btnPlay.disabled = false;
		btnDownload.disabled = false;
	}
}

//播放按钮监听
btnPlay.onclick = ()=>{
	var blob = new Blob(buffer, {type : 'video/webm'});
	recvideo.src = window.URL.createObjectURL(blob);
	recvideo.srcObject = null;
	recvideo.controls = true;
	recvideo.play();
}

//下载按钮监听
btnDownload.onclick = ()=>{
	var blob = new Blob(buffer, {type: 'video/webm'});
	var url = window.URL.createObjectURL(blob);
	var a = document.createElement('a');

	a.href = url;
	a.style.display = 'none';
	a.download = 'aaa.webm';
	a.click();
}

3 效果预览

预览屏幕共享

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值