2
使用html5 javascript 共享屏幕与录屏
source link: https://blog.p2hp.com/archives/9514
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
使用html5 javascript 共享屏幕与录屏
使用html5 javascript 共享屏幕: json
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="robots" content="noindex, nofollow">
<style>
body {
padding: 0;
margin: 0;
svg:not(:root) {
display: block;
.playable-code {
background-color: #f4f7f8;
border: none;
border-left: 6px solid #558abb;
border-width: medium medium medium 6px;
color: #4d4e53;
height: 100px;
width: 90%;
padding: 10px 10px 0;
.playable-canvas {
border: 1px solid #4d4e53;
border-radius: 2px;
.playable-buttons {
text-align: right;
width: 90%;
padding: 5px 10px 5px 26px;
</style>
<style>
#video {
border: 1px solid #999;
width: 98%;
max-width: 860px;
.error {
color: red;
.warn {
color: orange;
.info {
color: darkgreen;
</style>
<title>Using the Screen Capture API - simple_screen_capture - code sample</title>
</head>
<body>
<p>This example shows you the contents of the selected part of your display.
Click the Start Capture button to begin.</p>
<p><button id="start">Start Capture</button> <button id="stop">Stop Capture</button></p>
<video id="video" autoplay></video>
<br>
<strong>Log:</strong>
<br>
<pre id="log"></pre>
<script>
const videoElem = document.getElementById("video");
const logElem = document.getElementById("log");
const startElem = document.getElementById("start");
const stopElem = document.getElementById("stop");
// Options for getDisplayMedia()
const displayMediaOptions = {
video: {
cursor: "always"
audio: false
// Set event listeners for the start and stop buttons
startElem.addEventListener("click", (evt) => {
startCapture();
}, false);
stopElem.addEventListener("click", (evt) => {
stopCapture();
}, false);
console.log = (msg) => logElem.innerHTML += `${msg}<br>`;
console.error = (msg) => logElem.innerHTML += `<span class="error">${msg}</span><br>`;
console.warn = (msg) => logElem.innerHTML += `<span class="warn">${msg}<span><br>`;
console.info = (msg) => logElem.innerHTML += `<span class="info">${msg}</span><br>`;
async function startCapture() {
logElem.innerHTML = "";
videoElem.srcObject = await navigator.mediaDevices.getDisplayMedia(displayMediaOptions);
dumpOptionsInfo();
} catch (err) {
console.error(`Error: ${err}`);
function stopCapture(evt) {
let tracks = videoElem.srcObject.getTracks();
tracks.forEach((track) => track.stop());
videoElem.srcObject = null;
function dumpOptionsInfo() {
const videoTrack = videoElem.srcObject.getVideoTracks()[0];
console.info("Track settings:");
console.info(JSON.stringify(videoTrack.getSettings(), null, 2));
console.info("Track constraints:");
console.info(JSON.stringify(videoTrack.getConstraints(), null, 2));
</script>
</body>
</html>
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="robots" content="noindex, nofollow"> <style> body { padding: 0; margin: 0; } svg:not(:root) { display: block; } .playable-code { background-color: #f4f7f8; border: none; border-left: 6px solid #558abb; border-width: medium medium medium 6px; color: #4d4e53; height: 100px; width: 90%; padding: 10px 10px 0; } .playable-canvas { border: 1px solid #4d4e53; border-radius: 2px; } .playable-buttons { text-align: right; width: 90%; padding: 5px 10px 5px 26px; } </style> <style> #video { border: 1px solid #999; width: 98%; max-width: 860px; } .error { color: red; } .warn { color: orange; } .info { color: darkgreen; } </style> <title>Using the Screen Capture API - simple_screen_capture - code sample</title> </head> <body> <p>This example shows you the contents of the selected part of your display. Click the Start Capture button to begin.</p> <p><button id="start">Start Capture</button> <button id="stop">Stop Capture</button></p> <video id="video" autoplay></video> <br> <strong>Log:</strong> <br> <pre id="log"></pre> <script> const videoElem = document.getElementById("video"); const logElem = document.getElementById("log"); const startElem = document.getElementById("start"); const stopElem = document.getElementById("stop"); // Options for getDisplayMedia() const displayMediaOptions = { video: { cursor: "always" }, audio: false }; // Set event listeners for the start and stop buttons startElem.addEventListener("click", (evt) => { startCapture(); }, false); stopElem.addEventListener("click", (evt) => { stopCapture(); }, false); console.log = (msg) => logElem.innerHTML += `${msg}<br>`; console.error = (msg) => logElem.innerHTML += `<span class="error">${msg}</span><br>`; console.warn = (msg) => logElem.innerHTML += `<span class="warn">${msg}<span><br>`; console.info = (msg) => logElem.innerHTML += `<span class="info">${msg}</span><br>`; async function startCapture() { logElem.innerHTML = ""; try { videoElem.srcObject = await navigator.mediaDevices.getDisplayMedia(displayMediaOptions); dumpOptionsInfo(); } catch (err) { console.error(`Error: ${err}`); } } function stopCapture(evt) { let tracks = videoElem.srcObject.getTracks(); tracks.forEach((track) => track.stop()); videoElem.srcObject = null; } function dumpOptionsInfo() { const videoTrack = videoElem.srcObject.getVideoTracks()[0]; console.info("Track settings:"); console.info(JSON.stringify(videoTrack.getSettings(), null, 2)); console.info("Track constraints:"); console.info(JSON.stringify(videoTrack.getConstraints(), null, 2)); } </script> </body> </html>
录制屏幂:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>在线屏幕录制</title>
<style>
body{
font-family: Arial;
margin: 4vh auto;
width: 90vw;
max-width: 600px;
text-align: center;
#controls{
text-align: center;
.btn{
margin: 10px 5px;
padding: 15px;
background-color: #2bcbba;
border: none;
color: white;
font-weight: bold;
border-radius: 6px;
outline: none;
font-size: 1.2em;
width: 120px;
height: 50px;
.btn:hover{
background-color: #26de81;
cursor: hand;
.btn:disabled{
background-color: #2bcbba80;
#stop{
background-color: #fc5c65;
#video{
margin-top: 10px;
margin-bottom: 20px;
border: 12px solid #a5adb0 ;
border-radius: 15px;
outline: none;
width: 100%;
height: 400px;
background-color: black;
color: #2bcbba;
letter-spacing:-2.5px;
line-height: 30px;
.created{
color: lightgrey;
letter-spacing: -0.7px;
font-size: 1em;
margin-top: 40px;
.created > a{
color: #4b7bec;
text-decoration: none;
</style>
</head>
<body>
<h1><u style='color:#fc5c65'>在线屏幕录制</u><br>支持 :新版本 Chrome,Edge,Firefox 桌面浏览器 <br></h1>
<video autoplay='true' id='video' controls='true' controlsList='nodownload'></video>
<button class='btn' id='record' onclick='record()'>录制</button>
<button style='display: none' class='btn' id='stop' onclick='stop()'>停止</button>
<button disabled='true' class='btn' id='download' onclick='download()'>下载</button>
<div class='created'> </div>
<br>
</body>
<script>
const video = document.getElementById('video')
const downloadBtn = document.getElementById('download')
const recordBtn = document.getElementById('record')
const stopBtn = document.getElementById('stop')
let recorder
async function record() {
let captureStream
captureStream = await navigator.mediaDevices.getDisplayMedia({
video: true,
// audio: true, not support
cursor: 'always'
}catch(e){
alert("Could not get stream")
return
downloadBtn.disabled = true
recordBtn.style = 'display: none'
stopBtn.style = 'display: inline'
window.URL.revokeObjectURL(video.src)
video.autoplay = true
video.srcObject = captureStream
recorder = new MediaRecorder(captureStream)
recorder.start()
captureStream.getVideoTracks()[0].onended = () => {
recorder.stop()
recorder.addEventListener("dataavailable", event => {
let videoUrl = URL.createObjectURL(event.data, {type: 'video/ogg'})
video.srcObject = null
video.src = videoUrl
video.autoplay = false
downloadBtn.disabled = false
recordBtn.style = 'display: inline'
stopBtn.style = 'display: none'
function download(){
const url = video.src
const name = new Date().toISOString().slice(0, 19).replace('T',' ').replace(" ","_").replace(/:/g,"-")
const a = document.createElement('a')
a.style = 'display: none'
a.download = `${name}.ogg`
a.href = url
document.body.appendChild(a)
a.click()
function stop(){
let tracks = video.srcObject.getTracks()
tracks.forEach(track => track.stop())
recorder.stop()
</script>
</html>
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <title>在线屏幕录制</title> <style> body{ font-family: Arial; margin: 4vh auto; width: 90vw; max-width: 600px; text-align: center; } #controls{ text-align: center; } .btn{ margin: 10px 5px; padding: 15px; background-color: #2bcbba; border: none; color: white; font-weight: bold; border-radius: 6px; outline: none; font-size: 1.2em; width: 120px; height: 50px; } .btn:hover{ background-color: #26de81; cursor: hand; } .btn:disabled{ background-color: #2bcbba80; } #stop{ background-color: #fc5c65; } #video{ margin-top: 10px; margin-bottom: 20px; border: 12px solid #a5adb0 ; border-radius: 15px; outline: none; width: 100%; height: 400px; background-color: black; } h1{ color: #2bcbba; letter-spacing:-2.5px; line-height: 30px; } .created{ color: lightgrey; letter-spacing: -0.7px; font-size: 1em; margin-top: 40px; } .created > a{ color: #4b7bec; text-decoration: none; } </style> </head> <body> <h1><u style='color:#fc5c65'>在线屏幕录制</u><br>支持 :新版本 Chrome,Edge,Firefox 桌面浏览器 <br></h1> <video autoplay='true' id='video' controls='true' controlsList='nodownload'></video> <button class='btn' id='record' onclick='record()'>录制</button> <button style='display: none' class='btn' id='stop' onclick='stop()'>停止</button> <button disabled='true' class='btn' id='download' onclick='download()'>下载</button> <div class='created'> </div> <br> </body> <script> const video = document.getElementById('video') const downloadBtn = document.getElementById('download') const recordBtn = document.getElementById('record') const stopBtn = document.getElementById('stop') let recorder async function record() { let captureStream try{ captureStream = await navigator.mediaDevices.getDisplayMedia({ video: true, // audio: true, not support cursor: 'always' }) }catch(e){ alert("Could not get stream") return } downloadBtn.disabled = true recordBtn.style = 'display: none' stopBtn.style = 'display: inline' window.URL.revokeObjectURL(video.src) video.autoplay = true video.srcObject = captureStream recorder = new MediaRecorder(captureStream) recorder.start() captureStream.getVideoTracks()[0].onended = () => { recorder.stop() } recorder.addEventListener("dataavailable", event => { let videoUrl = URL.createObjectURL(event.data, {type: 'video/ogg'}) video.srcObject = null video.src = videoUrl video.autoplay = false downloadBtn.disabled = false recordBtn.style = 'display: inline' stopBtn.style = 'display: none' }) } function download(){ const url = video.src const name = new Date().toISOString().slice(0, 19).replace('T',' ').replace(" ","_").replace(/:/g,"-") const a = document.createElement('a') a.style = 'display: none' a.download = `${name}.ogg` a.href = url document.body.appendChild(a) a.click() } function stop(){ let tracks = video.srcObject.getTracks() tracks.forEach(track => track.stop()) recorder.stop() } </script> </html>
参考 https://developer.mozilla.org/en-US/docs/Web/API/Screen_Capture_API/Using_Screen_Capture
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK