用JS創(chuàng)建一個(gè)錄屏功能
OBS studio很酷,但 JavaScript 更酷,現(xiàn)在,我們用 JavaScript 創(chuàng)建自己的錄屏功能。
首先,創(chuàng)建一個(gè)HTML文件,包含記錄按鈕和一個(gè)播放標(biāo)簽,
內(nèi)容如下:
<!DOCTYPE html>
<html>
<head>
<title>Parcel Sandbox</title>
<meta charset="UTF-8" />
</head>
<body>
<video class="video" width="600px" controls></video>
<button class="record-btn">record</button>
<script src="./index.js"></script>
</body>
</html>
然后在創(chuàng)建 index.js,
監(jiān)聽按鈕的點(diǎn)擊:
let btn = document.querySelector(".record-btn");
btn.addEventListener("click", function () {
console.log("hello");
});
在瀏覽器中打開 html文件,點(diǎn)擊按鈕,我們可以在控制臺(tái)看到打印的 hello。

現(xiàn)在把打印去掉,換成如下的內(nèi)容:
let btn = document.querySelector(".record-btn");
btn.addEventListener("click", async function () {
let stream = await navigator.mediaDevices.getDisplayMedia({
video: true
});
});
現(xiàn)在點(diǎn)擊按鈕,會(huì)彈出屏幕選擇框:

因?yàn)?,我現(xiàn)在用的是兩個(gè)屏幕,所以會(huì)出現(xiàn)兩個(gè)選擇。
現(xiàn)在你可能認(rèn)為選擇一個(gè)屏幕,然后點(diǎn)擊分享,就開始錄制了。非也,這個(gè)比我們想象中的復(fù)雜點(diǎn)。我們要使用 MediaRecorder 來(lái)錄制我們的視頻。
let btn = document.querySelector(".record-btn")
btn.addEventListener("click", async function () {
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
})
// 必須手動(dòng)啟動(dòng)
mediaRecorder.start()
})
當(dāng)我們的屏幕被錄制下來(lái)時(shí),mediaRecorder 會(huì)給我們提供分塊的數(shù)據(jù),我們需要將這些數(shù)據(jù)存儲(chǔ)在一個(gè)變量中。
let btn = document.querySelector(".record-btn")
btn.addEventListener("click", async function () {
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)
})
// 必須手動(dòng)啟動(dòng)
mediaRecorder.start()
})
現(xiàn)在,當(dāng)我們點(diǎn)擊停止共享按鈕時(shí),希望在我們的 video元素中播放錄制的視頻,可以這么做:
let btn = document.querySelector(".record-btn")
btn.addEventListener("click", async function () {
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 video = document.querySelector(".video")
video.src = URL.createObjectURL(blob)
})
// 必須手動(dòng)啟動(dòng)
mediaRecorder.start()
})
現(xiàn)在基本就可以完成了,可以在潤(rùn)色下,如自動(dòng)下載錄制的視頻,
可以這么做:
let btn = document.querySelector(".record-btn")
btn.addEventListener("click", async function () {
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 url = URL.createObjectURL(blob)
let video = document.querySelector("video")
video.src = url
let a = document.createElement('a')
a.href = url
a.download = 'video.webm'
a.click()
})
// 必須手動(dòng)啟動(dòng)
mediaRecorder.start()
})
現(xiàn)在,最基本的一個(gè)錄制功能就完善了,動(dòng)手來(lái)試試吧!!
到此這篇關(guān)于用JS創(chuàng)建一個(gè)錄屏功能的文章就介紹到這了,更多相關(guān)JS創(chuàng)建一個(gè)錄屏功能內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信小程序通過(guò)api接口將json數(shù)據(jù)展現(xiàn)到小程序示例
這篇文章主要介紹了微信小程序通過(guò)api接口將json數(shù)據(jù)展現(xiàn)到小程序示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
Vue.js React與Angular流行前端框架優(yōu)勢(shì)對(duì)比
這篇文章主要為大家介紹了Vue.js React與Angular流行前端框架優(yōu)勢(shì)對(duì)比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
微信小程序 出現(xiàn)47001 data format error原因解決辦法
這篇文章主要介紹了微信小程序 出現(xiàn)47001 data format error原因解決辦法的相關(guān)資料,需要的朋友可以參考下2017-03-03
JavaScript嚴(yán)格模式不支持八進(jìn)制的問(wèn)題講解
這篇文章主要講解JavaScript嚴(yán)格模式不支持八進(jìn)制的問(wèn)題,本文圍繞JavaScript嚴(yán)格模式展開內(nèi)容,詳細(xì)介紹為什么JavaScript嚴(yán)格模式不支持八進(jìn)制,下面來(lái)看看詳細(xì)介紹,需要的朋友可以參考一下2021-11-11
微信小程序 image組件binderror使用例子與js中的onerror區(qū)別
這篇文章主要介紹了微信小程序 image組件binderror使用例子與js中的onerror區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-02-02
4個(gè)頂級(jí)JavaScript高級(jí)文本編輯器
今天小編就為大家分享一篇關(guān)于4個(gè)頂級(jí)JavaScript高級(jí)文本編輯器,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10
JS觸摸屏網(wǎng)頁(yè)版仿app彈窗型滾動(dòng)列表選擇器/日期選擇器
這篇文章主要介紹了觸摸屏網(wǎng)頁(yè)版仿app彈窗型滾動(dòng)列表選擇器/日期選擇器的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10

