服务器之家

服务器之家 > 正文

炸裂,用JS创建一个录屏功能

时间:2021-11-10 23:07     来源/作者:大迁世界

炸裂,用JS创建一个录屏功能

OBS studio很酷,但 JavaScript 更酷,现在,我们用 JavaScript 创建自己的录屏功能。

首先,创建一个HTML文件,包含记录按钮和一个播放标签,内容如下:

  1. <!DOCTYPE html>  
  2. <html>  
  3.   <head>  
  4.     <title>Parcel Sandbox</title>  
  5.     <meta charset="UTF-8" />  
  6.   </head>  
  7.   <body>  
  8.     <video class="video" width="600px" controls></video>  
  9.     <button class="record-btn">record</button>  
  10.   
  11.     <script src="./index.js"></script>  
  12.   </body>  
  13. </html>  

然后在创建 index.js,监听按钮的点击:

  1. let btn = document.querySelector(".record-btn");
  2.  
  3. btn.addEventListener("click", function () {
  4. console.log("hello");
  5. });

在浏览器中打开 html文件,点击按钮,我们可以在控制台看到打印的 hello。

炸裂,用JS创建一个录屏功能

现在把打印去掉,换成如下的内容:

  1. let btn = document.querySelector(".record-btn");
  2.  
  3. btn.addEventListener("click", async function () {
  4. let stream = await navigator.mediaDevices.getDisplayMedia({
  5. video: true
  6. });
  7. });

现在点击按钮,会弹出屏幕选择框:

炸裂,用JS创建一个录屏功能

因为,我现在用的是两个屏幕,所以会出现两个选择。

现在你可能认为选择一个屏幕,然后点击分享,就开始录制了。非也,这个比我们想象中的复杂点。我们要使用 MediaRecorder 来录制我们的视频。

  1. let btn = document.querySelector(".record-btn")
  2.  
  3. btn.addEventListener("click", async function () {
  4. let stream = await navigator.mediaDevices.getDisplayMedia({
  5. video: true
  6. })
  7.  
  8. // 需要更好的浏览器支持
  9. const mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9")
  10. ? "video/webm; codecs=vp9"
  11. : "video/webm"
  12. let mediaRecorder = new MediaRecorder(stream, {
  13. mimeType: mime
  14. })
  15. // 必须手动启动
  16. mediaRecorder.start()
  17. })

当我们的屏幕被录制下来时,mediaRecorder 会给我们提供分块的数据,我们需要将这些数据存储在一个变量中。

  1. let btn = document.querySelector(".record-btn")
  2.  
  3. btn.addEventListener("click", async function () {
  4. let stream = await navigator.mediaDevices.getDisplayMedia({
  5. video: true
  6. })
  7.  
  8. // 需要更好的浏览器支持
  9. const mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9")
  10. ? "video/webm; codecs=vp9"
  11. : "video/webm"
  12. let mediaRecorder = new MediaRecorder(stream, {
  13. mimeType: mime
  14. })
  15.  
  16. let chunks = []
  17. mediaRecorder.addEventListener('dataavailable', function(e) {
  18. chunks.push(e.data)
  19. })
  20.  
  21. // 必须手动启动
  22. mediaRecorder.start()
  23. })

现在,当我们点击停止共享按钮时,希望在我们的 video元素中播放录制的视频,可以这么做:

  1. let btn = document.querySelector(".record-btn")
  2.  
  3. btn.addEventListener("click", async function () {
  4. let stream = await navigator.mediaDevices.getDisplayMedia({
  5. video: true
  6. })
  7.  
  8. // 需要更好的浏览器支持
  9. const mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9")
  10. ? "video/webm; codecs=vp9"
  11. : "video/webm"
  12. let mediaRecorder = new MediaRecorder(stream, {
  13. mimeType: mime
  14. })
  15.  
  16. let chunks = []
  17. mediaRecorder.addEventListener('dataavailable', function(e) {
  18. chunks.push(e.data)
  19. })
  20.  
  21. mediaRecorder.addEventListener('stop', function(){
  22. let blob = new Blob(chunks, {
  23. type: chunks[0].type
  24. })
  25.  
  26. let video = document.querySelector(".video")
  27. video.src = URL.createObjectURL(blob)
  28. })
  29.  
  30.  
  31. // 必须手动启动
  32. mediaRecorder.start()
  33. })

现在基本就可以完成了,可以在润色下,如自动下载录制的视频,可以这么做:

  1. let btn = document.querySelector(".record-btn")
  2.  
  3. btn.addEventListener("click", async function () {
  4. let stream = await navigator.mediaDevices.getDisplayMedia({
  5. video: true
  6. })
  7.  
  8. // 需要更好的浏览器支持
  9. const mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9")
  10. ? "video/webm; codecs=vp9"
  11. : "video/webm"
  12. let mediaRecorder = new MediaRecorder(stream, {
  13. mimeType: mime
  14. })
  15.  
  16. let chunks = []
  17. mediaRecorder.addEventListener('dataavailable', function(e) {
  18. chunks.push(e.data)
  19. })
  20.  
  21. mediaRecorder.addEventListener('stop', function(){
  22. let blob = new Blob(chunks, {
  23. type: chunks[0].type
  24. })
  25. let url = URL.createObjectURL(blob)
  26.  
  27. let video = document.querySelector("video")
  28. video.src = url
  29.  
  30. let a = document.createElement('a')
  31. a.href = url
  32. a.download = 'video.webm'
  33. a.click()
  34. })
  35.  
  36.  
  37. // 必须手动启动
  38. mediaRecorder.start()
  39. })

现在,最基本的一个录制功能就完善了,动手来试试吧!!

作者:Lokender Singh 译者:前端小智

来源:dev 原文:https://dev.to/0shuvo0/lets-create-a-screen-recorder-with-js-3leb

炸裂,用JS创建一个录屏功能

原文链接:https://mp.weixin.qq.com/s/k2OcbUfqw3jz0s1w66cx0w

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部