使用原生实现一个屏幕录制功和存储功能
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0">
<link rel="stylesheet" href="main.css">
</head>
<body>
<!-- 控制按钮 -->
<div>
<button id="startCaptureScreenButton">开始捕获屏幕</button>
<button id="stopCaptureScreenButton">停止捕获屏幕</button>
<button id="startCaptureCameraButton">开始捕获摄像头和麦克风</button>
<button id="stopCaptureCameraButton">停止捕获摄像头和麦克风</button>
</div>
<!-- 视频预览 -->
<div>
<video id="video" autoplay muted></video>
</div>
<script src="main.js"></script>
</body>
</html>

let stream
let recorder
startCaptureScreenButton.addEventListener('click', async () => {
stream = await navigator.mediaDevices.getDisplayMedia()
video.srcObject = stream
startRecord()
})
stopCaptureScreenButton.addEventListener('click', () => {
stream.getTracks().forEach(track => track.stop())
video.srcObject = null
stopRecord()
})
startCaptureCameraButton.addEventListener('click', async () => {
stream = await navigator.mediaDevices.getUserMedia({
video: true,
audio: true,
})
video.srcObject = stream
startRecord()
})
stopCaptureCameraButton.addEventListener('click', () => {
stream.getTracks().forEach(track => track.stop())
video.srcObject = null
stopRecord()
})
function startRecord() {
recorder = new MediaRecorder(stream)
const chunks = []
recorder.ondataavailable = (event) => {
chunks.push(event.data)
}
recorder.onstop = () => {
const blob = new Blob(chunks, { type: 'video/webm' })
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = 'my-awesome-video.webm'
document.body.append(a)
a.click()
a.remove()
URL.revokeObjectURL(url)
}
recorder.start()
}
function stopRecord() {
recorder.stop()
}