【Web API系列】使用getDisplayMedia来实现录屏功能

在这里插入图片描述

文章目录

  • 前言
  • 一、认识getD该处使用的url网络请求的数据。
  • 二、使用步骤
    • 1.使用方法一实现录屏
    • 2.使用方法二实现录屏
    • 3. 运行效果
  • 延伸


前言

Web API经过长期的发展,尤其是最近,发展相当迅猛,现在已经支持很多功能了,一些原生就支持的功能也是做的相当好,这也带来了现在一些跨端应用的升级。有许多跨端的App框架可以考虑,就比如Tauri2.0就开启了跨端,又或者Uni X,现在也是在做原生级别的跨端应用框架。

最近用了好多相关内容,所以将其分享给大家。

本文直接开始使用Web API中MediaDevices的getDisplayMedia方法来实现录屏或直播效果。(如果你有兴趣可以上后探索探索)

如果你对这个API本身很感兴趣,建议看看原文。


一、认识getD该处使用的url网络请求的数据。

—isplayMedia
getDisplayMedia方法是浏览器Web API中MediaDevices的一个函数。它允许网页开发者在浏览器中捕获和共享用户设备(如屏幕、窗口或摄像头)的媒体内容。

通过调用getDisplayMedia方法,网页开发者可以请求用户允许共享屏幕、窗口或摄像头的权限。一旦用户授权,网页开发者就可以在网页中获取媒体流,并将其用于实时通信、视频录制、屏幕分享等功能。

使用getDisplayMedia方法的一般步骤如下:

  1. 调用getDisplayMedia方法,传递一个MediaStreamConstraints对象作为参数,该对象描述了要请求的媒体类型和约束条件。

  2. 如果用户允许共享媒体内容,则返回一个Promise对象,该Promise对象解析为一个MediaStream对象。如果用户拒绝共享或硬件不可用,则Promise对象会被拒绝。

  3. 使用返回的媒体流进行进一步的操作,如获取媒体流中的轨道,显示在网页中,发送到服务器等。

getDisplayMedia方法该处使用的url网络请求的数据。

—通常与其他媒体相关的API(如MediaRecorder和WebRTC)结合使用,以便实现功能丰富的实时通信和多媒体应用程序。

二、使用步骤

经过我查找getDisplayMedia的相关资料,getDisplayMedia的使用方法基本上可以分为两种:

  1. 获取流,然后设置到一个新建的video标签,然都对video的流进行处理。
  2. 获取流,然后使用MediaStreamTrackProcessor转换为视频帧进行处理。

方法2会有更多的用处,比如实现在线剪辑,批量剪辑,以及AI剪辑都有很大的帮助。除此以外,还有另一种使用stream API的通道写法,但是我写了怎么也不生效,如果有大佬还麻烦请帮我看看怎么回事。

1.使用方法一实现录屏

方法一其实质就是将视频源直接设置到video标签,然后video标签会自动处理一些数据,算是比较常用的方式,代码如下

// 获取canvas元素
let canvas = document.getElementById('canvas');
// 获取2d上下文
let ctx = canvas.getContext('2d');
// 创建video标签
let video = document.createElement('video');
// 异步或者不异步都行,选择你喜欢的一种方式
async function start() {const userStream = await navigator.mediaDevices.getDisplayMedia({// 开启视频video: true,// 关闭音频,选择适合你的audio: false});// video标签的源设置为获取到的流video.srcObject = userStream;// 播放视频video.play();// 请求动画帧window.requestAnimationFrame(frame);
}
// 这里是每帧进行的处理
frame = () => {if (video.readyState == video.HAVE_ENOUGH_DATA) {canvas.hidden = false;canvas.height = window.innerHeight;canvas.width = window.innerWidth;ctx.drawImage(video, 0, 0, canvas.width, canvas.height);let imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);// 做其他事情,比如绘制二维码或者文字或者扫描二维码,只要你有想法}window.requestAnimationFrame(frame);
}
function stop(){video.srcObject.getTracks().forEach((track) => track.stop());
}

2.使用方法二实现录屏

方法二是官方给出的结合stream API之前的一种死循环的方式来读取视频流的每帧,然后绘制到canvas。

// 获取canvas元素
let canvas = document.getElementById('canvas');
// 获取2d上下文
let ctx = canvas.getContext('2d');
// 创建video标签
let video = document.createElement('video');
// 异步或者不异步都行,选择你喜欢的一种方式
const track = null;
async function start() {const userStream = await navigator.mediaDevices.getDisplayMedia({video: true,audio: false});track = userStream.getVideoTracks()[0];const processor = new MediaStreamTrackProcessor(track);const reader = processor.readable.getReader();while (true) {const {done, value} = await reader.read();if (done) {break;}const frame = value;// 这里对每帧进行处理ctx.drawImage(frame, 0, 0, canvas.width, canvas.height);frame.close();}
}
function stop(){track.stop();
}

3. 运行效果


在这里插入图片描述

延伸


  1. 要想实现完整的录屏功能,还需要实现保存录像文件等功能,在后面如果接触到了文件操作等,我会详细的写如何将录制的文件保存下来。 如果你现在就有兴趣想要研究,建议看前面的MDN
  2. 该功能可以使用谷歌的stream api来做,但是我的代码一直不能正常运行,希望能有大佬帮我看看。
  3. 除了Stream API,实际上还可以用rxjs做,目前我也在研究中,如果有了结果我会发另一篇文章来介绍如何使用rxjs来实现,rxjs对于流操作还是比较擅长的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/579267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Linux]——彻底学通权限

学习权限 一、权限概念二、权限管理2.1文件访问者分类(人)2.2文件类型和访问权限(事物的属性)2.3 文件访问权限的相关设置方法 三、目录的权限3.1、进入目录的权限3.2、粘滞位 四、关于权限的总结 一、权限概念 Linux下有两种用户…

【AI】Langchain-Chatchat搭建本地知识库-未完,先记录踩的坑

事先说一下,我本地的显卡4070只有12G显存,无法运行本地知识库,我把自己折腾的过程和遇到的坑先记录一下吧,后续如果有算力的话就再跑一遍试试。后续来了:【AI】使用阿里云免费服务器搭建Langchain-Chatchat本地知识库 …

阿赵UE学习笔记——4、新建关卡

阿赵UE学习笔记目录 大家好,我是阿赵。   之前介绍了虚幻引擎的常用窗口功能,这次开始创建游戏内的世界了。首先先从创建关卡开始。 一、创建新关卡 在使用UE引擎制作游戏,首先要有一个场景作为基础,这个场景在UE里面成为关卡。…

PHP面向对象基础之类、对象和基本特点

类就是同一类事物的划分,比如车,当然车还可以划分其他类,比如小轿车、大卡车等。通俗点,类就是指由变量和作用于变量的函数组成的集合。 对象是类的一个实例,比如车牌固定的一辆车。 面向对象编程的三个特点&#xff1…

带你认识 WIDGET、WINDOW 、FRAME和 FRAMEGROUP

1、概述 在 YonBuilder 移动开发中,开发者需要了解一些常用的概念术语,其中和App整体框架结构及页面层级组成相关最重要几个重要概念,就是 Widget、 Window 和 Frame、frameGroup。掌握了这几个概念,对于开发者开发 App 时的 API…

docker container 指定gpu设备

1, 在yaml中 Turn on GPU access with Docker Compose | Docker Docs Example of a Compose file for running a service with access to 1 GPU device: services:test:image: nvidia/cuda:12.3.1-base-ubuntu20.04command: nvidia-smideploy:resources:reserva…

linux离线安装jdk11

1. 下载java11,Java Downloads | Oracle 2. 文件安装 jdk11: mkdir /usr/lib/jvm/ 将下载的文件,解压到/usr/lib/jvm/下 tar -zxf jdk-11.0.21_linux-x64_bin.tar.gz -C /usr/lib/jvm/ 3. 将以下命令写入bashrc文件 export JAVA_HOME/us…

ARAM 中断实验

思路:按键->EXTI->GIC->CPU->异常向量表 //使能GPIOF时钟 //设置PF9管脚为输入(KEY1) //设置PF9作为EXTI9事件的输入(事件编号对应管脚号) //设置下降沿使能检测EXTI9事件 (也可设置上升沿没有下降沿严谨方便,不同场景不同选择) //设置EXTI9事件不…

26、湾湾国立阳明交通大学、湾湾长庚纪念医院提出:ALL Attention U-Net,独属头部CT分割的[玛格丽特]

本文由台湾国立阳明交通大学、台湾长庚纪念医院于2023年12月16日在arXiv<Image and Video Processing>发表。 论文地址&#xff1a; 2312.10483.pdf (arxiv.org) 0、Abstract 脑出血在 Head CT扫描中作为第一线工具&#xff0c;帮助专家诊断不同类型的出血。然而&…

云端的DevOps之旅:深入了解AWS Code系列工具

对于开发者和IT专业人员来说&#xff0c;理解这些工具如何帮助我们从代码编写、编译、测试到部署的完整流程将极其重要。今天&#xff0c;我将详细介绍 AWS CodeCommit, CodeBuild, CodeDeploy, 和CodePipeline 这一系列以“Code”命名的开发和部署工具 AWS CodeCommit&#x…

Tomcat面试题(10道含答案),由浅入深

请解释Tomcat的基本概念和作用 Tomcat是一个开源的Java Web服务器和Servlet容器&#xff0c;用于提供基于Java的应用程序运行环境。它支持Java Servlet规范&#xff0c;使得开发者能够快速构建和部署基于Web的应用程序。 请描述Tomcat的目录结构&#xff0c;并解释各个目录的…

cmd启动Java项目提示:jar中没有主清单属性

1、问题 2、原因 在IDEA中开发SpringBoot项目并打成jar包&#xff0c; 需要添加springboot打包插件&#xff0c;如果不添加&#xff0c;仅仅用maven进行打包&#xff0c;打成包里面是少文件的。 <build><plugins><!--springboot打包插件--><plugin>&…

ElasticSearch之RestClient笔记

1. ElasticSearch 1.1 倒排索引 1.2 ElasticSearch和Mysql对比 1.3 RestClient操作 导入依赖 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.15.…

枚举(蓝桥杯备赛系列)acwing版

枚举 前言 hello&#xff0c;大家好&#xff0c;前面一段时间已经是把acwing Linux基础课讲完了&#xff0c;其实那些内容完全可以带领小白入门Linux我说过如果有人留言要Linux和Windows server 配置DNS Web ftp 的内容我就做一期&#xff0c;但是没人留言我也就先不自作多情了…

【HeyGen】让照片开口说话 —— 登录和使用:详细指南!

【HeyGen】让照片开口说话 关于HeyGen登录HeyGenStep1. 点击”免费开始使用“Step2. 账号注册Step3. 再次点击”Get Started“Step4. 常规个人信息调查Step5. 登录成功 使用HeyGenStep1. 上传Avatar&#xff08;头像&#xff09;Step2. 选定Avatar&#xff08;头像&#xff09;…

漏洞复现-泛微OA xmlrpcServlet接口任意文件读取漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

Java基础回顾——JDBC

文章目录 介绍使用JDBC事务JDBC BatchJDBC连接池 介绍 Java为关系数据库定义了一套标准的访问接口&#xff1a;JDBC&#xff08;Java Database Connectivity&#xff09; JDBC是Java程序访问数据库的标准接口 好处&#xff1a; 各数据库厂商使用相同的接口&#xff0c;Java…

【DevOps 工具链】搭建 项目管理软件 禅道

文章目录 1、简介2、环境要求3、搭建部署环境3.1. 安装Apache服务3.2. 安装PHP环境&#xff08;以php7.0为例 &#xff09;3.3. 安装MySQL服务 4、搭建禅道4.1、下载解压4.2、 配置4.2.1、 启动4.2.2、自启动4.2.3、确认是否开机启动 5、成功安装 1、简介 禅道是国产开源项目管…

Java——基本数据类型

Java基本数据类型 一、 整型1. byte2. short3. int4. long 二、浮点型1. float2. double 三、 字符型(char)四、 布尔型&#xff08;boolean&#xff09; 总结 算下刚转Java到现在也有三个多月了&#xff0c;所以打算对Java的知识进行汇总一下&#xff0c;本篇文章介绍一下Java…

设计文档和技术方案的区别

设计文档和技术方案是软件开发过程中两个不同的概念&#xff0c;它们有以下区别&#xff1a; 定义和目的&#xff1a; 设计文档&#xff1a;设计文档是在软件开发过程中用于记录系统架构、模块设计、接口定义等详细设计信息的文档。它描述了软件系统的整体设计思路、模块之间…