【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对于流操作还是比较擅长的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA相关操作

目录 连接MySQL IDEA配置Maven 配置全局Maven 导入Maven项目 方法一 方法二 安装Mybatisx插件 连接MySQL 填写user和Password之后测试连接 如果是第一次连接需要联网下载数据库连接驱动,安装提示下载即可 如果显示如下错误需要更改时区 Server returns …

虚拟机安装windows2012和虚拟机安装国产系统deepin

虚拟机安装windows2012和虚拟机安装国产系统deepin 一.安装windows20121.安装VMWare虚拟机2.1.注意点一:VMWare虚拟网卡2.2.注意点二:配置虚拟网络编辑器3.安装配置Windows Server 2012 R23.1激活windows121.利用下面两个文件进行windows激活2.运行exe文…

5G NR无线蜂窝系统的信道估计器设计

文章目录 DMRS简介DMRS类型DMRS频域密度 信道估计实验仿真实验参数实验实验结论 DMRS简介 DMRS类型 类型A:DMRS位于时隙的第二个或第三个OFDM符号,由14个OFDM符号组成,当数据占据大部分时隙时使用A型映射。 类型B:用在URLLC中&a…

Linux 学习

复制/etc 文件夹到/mnt 目录 cp -r(-a) /etc /mnt回到上一次文件夹 cd -切换到当前用户的家目录_cd ~________________________如何查找ls 命令的位置_______which ls_________________________________请写出ll 命令中查看到的7大文件类型缩写 - s l p c b …

PDF编辑工具--Acrobat Pro DC 2023中文

Acrobat Pro DC 2023是一款功能强大的PDF编辑和管理软件,它可以帮助用户在创建、编辑、转换和共享PDF文档方面达到前所未有的高度。这款软件提供了丰富的编辑功能,使用户能够轻松添加注释、高亮、下划线、插入文本等,自由地编辑PDF文档。除了…

【MySQL变更】gh-ost原理解读

gh-ost简介 gh-ost是处理MySQL在线表结构变更的工具,与pt-osc 不同,gh-ost不会使用触发器。 gh-ost 可以进行测试,暂停,动态控制和重新配置,审计还有其他许多操作perks。 命名 最初它被命名为gh-osc:Git…

电子电气架构——车载ECU刷写工具vFlash简介

电子电气架构——车载ECU刷写工具vFlash简介 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值&a…

12.26 字符指针

一.基本应用 声明一个字符指针,char *ptr 初始化//在定义指针时,可以将它的初位置定义为空,即char *s NULL char *ptr "Hello"; // 指向字符串字面量的指针 char arr[] "World"; // 字符数组 char *ptr2 arr; // 指向字符数组的指针 访问指针指…

ALS-运动系统解构

角色握持 角色蓝图:将物体绑在手上 动作蓝图: 将握持动画截取一帧(explicit time时间写好) 角色替换 在原人物模型下面加一个骨骼体(先不用添加模型),重命名为bodymesh AI使用流程 新建一…

【OAuth2】:赋予用户控制权的安全通行证--代码模拟篇

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于OAuth2的相关操作吧 上篇已经讲了oauth2的相关知识,详解了oauth2的四种授权模式中的授权码模式,那么这一篇我们就来讲一下授权码模式的…

基于5G智能网关的智慧塔吊监测方案

塔吊是建筑施工中必不可少的设施,由于塔吊工作重心高、起重载荷大、人工视距/视角受限等因素,也使得塔吊在工作过程中着较多的危险因素。对此,可以部署基于工业5G智能网关搭建智慧塔吊安全监测系统,实现对塔吊运行的全局精细监测感…

NLP论文阅读记录 - 以大语言模型为参考学习总结

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作2.1文本生成模型的训练方法2.2 基于LLM的自动评估2.3 LLM 蒸馏和基于 LLM 的数据增强 三.本文方法3.1 Summarize as Large Language Models3.1.1 前提3.1.2 大型语言模型作为参考具有…

随记-语义分割

Semantic Segmentation 什么是语义分割全卷积网络FCN摘要 什么是语义分割 语义分割 Semantic Segmentation 旨在对图像的每个像素进行分类,将其分配给预定义的语义类别。 (检测图像中的物体并按属性分类) 实例分割 Instance Segmentation 实…

一台服务器​最大并发 tcp 连接数多少?65535?

首先,问题中描述的65535个连接指的是客户端连接数的限制。 在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三次握手后建立tcp连接。那么对单机,其最大并发tcp连接数是多少呢? 如何标…

HttpClient基础

简介&#xff1a; HttpClient是Apache的一个子项目&#xff0c;可以提供高效的、功能丰富的支持HTTP协议的客户端编程工具包&#xff0c;并且它支持HTTP协议最新的版本和建议。 作用&#xff1a; 发送HTTP请求接收响应数据 使用 导入maven坐标&#xff1a; <dependency&g…

VSLAM:对极几何

文章目录 概要对极约束推导参考概要 透视几何的缺陷是图像深度信息的丢失,如图1所示,根据相似变换关系,视线上的若干平面都映射为成像面上的一个平面。 图1 对极几何是两个透视几何模型间的几何约束关系,主要用于实现基于三角测量的双目立体视觉、深度估计等,对极几何约…

【代码学习】多标签分类 multilabel classfication | loss如何计算? | 衡量指标如何计算?

文章目录 loss计算 | BCELoss(), 最后sigmoid映射为0-1区间值衡量指标计算 sklearn.metrics代码 MultiLabelClassifier /CelebA_Classification_PyTorch_Github.ipynb loss计算 | BCELoss(), 最后sigmoid映射为0-1区间值 gpt解释 import torch import torch.nn as nn# 创建模…

全卷积网络

全卷积网络 全卷积网络就是图像到图像的变换&#xff0c;一般用于语义分割&#xff0c;图像恢复啥的 我们使用Resnet18来进行&#xff0c;最后平均池化和全连接层我们不需要 import torch import torchvision from torch import nn from torch.nn import functional as F fr…

sheng的学习笔记-【中】【吴恩达课后测验】Course 4 -卷积神经网络 - 第四周测验

课程4_第4周_测验题 目录 第一题 1.面部验证只需要将新图片与1个人的面部进行比较&#xff0c;而面部识别则需要将新图片与K个人的面部进行比较。 A. 【  】正确 B. 【  】错误 答案&#xff1a; A.【 √ 】正确 第二题 2.在人脸验证中函数d(img1,img2)起什么作用&a…

12.26_黑马数据结构与算法笔记Java

目录 243 图 Floyd Warshall 算法实现2 244 图 Floyd Warshall 算法实现3 245 图 Floyd Warshall 算法实现4 246 图 最小生成树 Prim 247 图 最小生成树 Kruskal 248 图 并查集 1 249 图 并查集 2 250 图 并查集 路径压缩 251 图 并查集 UnionBySize 252 贪心算法 介绍…