前端屏幕录制工具 + 录制<video>标签内容

news2024/12/24 3:39:49

一、录制的实现思路

1.开始录制、停止录制、下载视频

2.Blob介绍

3.概念

var mediaRecord //用于录制视频
var mediaStream //视频流
var videoBuffer = [] //保存的视频数据

二、屏幕录制工具

下载地址:
https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=en

https://www.tampermonkey.net/ https://greasyfork.org/en

三、录制标签内容

1.诉求

网页版本的推、拉流页面,含有标签,屏幕录制需要处理很多边角,选择直接录制流内容本身

2.可行性

写一个脚本,作为第三方去监控录制视频流。🉑️
Tampermonkey

3.难点

首先获取到标签

解决:

在这里插入图片描述
在这里插入图片描述

如何触发录制标签?

解决:

  • 网页控制台添加按钮入口,给予点击事件
    在这里插入图片描述
  • Tampermonkey插件控制录制脚本
    在这里插入图片描述

如何存储视频流 ?如何download本地?

解决:

  • 代码逻辑
  1. 要创建一个Canvas,视频标签本身不具备记录图像的功能,所以我们需要通过Canvas来实现这个功能
  2. 创建一个绑定到CanvasStream的记录器,以便记录器可以触发画布绘制的任何东西的回调
  3. 创建一个计时器,通过CanvasContext连续捕捉视频选项卡,然后将其绘制到画布上
  4. 创建一个字节数组,只要画布捕捉到新的屏幕,它就会触发MediaRecorder数据回调,将帧数据获取到数组中
  5. 每个帧数据本身就是一个Blob[]数据结构。所有的Blob数组组合在一起产生一个最终的Blob,这是录制的视频数据
  • 脚本编写
// ==UserScript==
// @name         录制YouTube
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://www.youtube.com/watch?v=vyfJgJBB3Vk
// @icon         https://www.google.com/s2/favicons?sz=64&domain=undefined.localhost
// @grant        none
// ==/UserScript==


(function() {
    'use strict';
    //alert("HHH")
    //document.body.appendChild(document.createElement("canvas"));
    var mc = document.createElement("canvas");
    mc.id="canvas";
    mc.style.cssText="position:absolute;top:0;left:0;z-index:1000000";
    mc.width='720';
    mc.height='540';
    document.body.appendChild(mc);

    var startbtn = document.createElement("button");
    startbtn.id="button-start";
    startbtn.innerHTML="开始录制";
    startbtn.style.cssText="position:absolute;top:120px;left:0;z-index:1000000";
    document.body.appendChild(startbtn);

    var stopbtn = document.createElement("button");
    stopbtn.id="button-stop";
    stopbtn.innerHTML="结束录制"
    stopbtn.style.cssText="position:absolute;top:150px;left:0;z-index:1000000";
    document.body.appendChild(stopbtn);


    let canvasElement = document.querySelector("#canvas");
    let startButton = document.querySelector("#button-start");
    let stopButton = document.querySelector("#button-stop");

    const videoWidth = 720;
    const videoHeight = 540;
    const frameRate = 60;
    const encodeType = "video/webm;codecs=vp8";

    let chunks = [];

    let frameId = null;

    //设置画布背景
    const canvasContext = canvasElement.getContext("2d");
    canvasContext.fillStyle = "deepskyblue";
    canvasContext.fillRect(0, 0, canvasElement.width, canvasElement.height);

    //创建MediaRecorder,设置媒体参数
    const stream = canvasElement.captureStream(frameRate);
    const recorder = new MediaRecorder(stream, {
        mimeType: encodeType
    });

    //收集录制数据
    recorder.ondataavailable = e => {
        chunks.push(e.data);
    };

    //按钮事件
    startButton.disabled = false;
    stopButton.disabled = true;
    startButton.onclick = e => {
        startButton.disabled = true;
        stopButton.disabled = false;
        recorder.start(10);
        drawFrame();
    };
    stopButton.onclick = e => {
        startButton.disabled = false;
        stopButton.disabled = true;
        recorder.stop();
        cancelAnimationFrame(frameId);
        download();
    };

    //播放视频
    function drawFrame() {
        let videoElement = document.getElementsByTagName("video")[0];
        console.log("videoElement",videoElement);
        canvasContext.drawImage(videoElement, 0, 0, videoWidth, videoHeight);
        frameId = requestAnimationFrame(drawFrame);
    }
     //下载录制内容
     function download() {
    let blob = new Blob(chunks);
    let url = window.URL.createObjectURL(blob);
    let link = document.createElement("a");
    link.href = url;
    link.download = new Date().getTime() + ".mp4";
    link.style.display = "none";
    document.body.appendChild(link);
    link.click();
    link.remove();

}
})();

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

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

相关文章

Linux- 系统随你玩之--文本处理三剑客--grep继任者awk

文章目录1、sed概述1.1、 与vim等编辑器的区别:1.2、sed工作原理1.3 、sed数据处理原理1.4 、正则表达式概念2、 sed语法和常用选项2.1、语法:2.2、sed常用内部命令2.3、参数:3、 sed 正则表达式(定位)3.1 、数字定址…

管理机密(RH294)

在ansible中有一个命令行工具ansible-vault可用于创建 编辑 加密 解密 查看文件举个栗子ansible-vaultcreate filenameNew Vault password: #输入密码Confirm New Vault password: #确认密码也可以使用别的方法 比如创建一个密码文件ansible-vaultcreate…

互联网开发必读Git工具利器-《30天精通Git版本控管》中文版免费分享

本书介绍在软体开发领域,对原始码进行版本控管是非常重要的一件事,有别于Subversion或TFS这类集中式版本控管系统,Git是一套分散式版本控管系统,并带来许多版本控管上的各种优势与解决传统集中式版本控管的缺失,例如支…

Spring Cloud_Hystrix断路器

目录一、概述1.分布式系统面临的问题2.是什么3.能干嘛4.官网资料5.Hystrix官宣,停更进维二、Hystrix重要概念1.服务降级Fallback2.服务熔断Breaker3.服务限流Flowlimit三、hystrix案例1.构建2.高并发测试3.故障现象和导致原因4.上诉结论5.如何解决?解决的…

面试_Selenium常见问题

1.selenium 工作原理 1.对于每一条Selenium脚本,一个http请求会被创建并且发送给浏览器的驱动 2.浏览器驱动中包含了一个HTTP Server,用来接收这些http请求 3.HTTP Server接收到请求后根据请求来具体操控对应的浏览器 4.浏览器执行具体的测试步骤 5.浏览…

Smali语法小记

Smali语法小记 介绍 在执行 Android Java 层的代码时,其实就是 Dalvik(ART) 虚拟机(使用 C 或 C 代码实现)在解析 Dalvik 字节码,从而模拟程序的执行过程。 自然,Dalvik 字节码晦涩难懂,研究人员们给出了…

通过 eShopOnContainers 项目学习一下微服务

这里是项目地址 https://github.com/dotnet-architecture/eShopOnContainers, 这是微软创建的一个基于 .NET 平台的微服务架构的示例应用程序,里面基本上市面上主流的时髦的技术都用上了。 因为涉及的内容比较多,所以我们只简单查看一下微服务的代码实现…

信息抽取命名实体识别和关系抽取)

信息抽取的定义为:从自然语言文本中抽取指定类型的实体,关系、事件等事实信息。并形成结构化数据输出的文本处理技术。 信息抽取是从文本数据中抽取特定信息的一种技术,文本数据由医学具体的单位构成,例如,句子、段落、…

JavaWeb—Vue的简单介绍

1 Vue介绍 概述 Vue是一套构建用户界面的渐进式前端框架。只关注视图层,并且非常容易学习,还可以很方便的与其它库或已有项目整合。通过尽可能简单的API来实现响应数据的绑定和组合的视图组件。 数据渲染 数据库 --JDBC–> java程序 --http协议–>…

《MySQL实战45讲》——学习笔记23 “binlogredolog 的写入机制/组提交机制“

本篇主要介绍数据的可靠性有关的知识,包括binlog的写入机制和redolog的写入机制,通过了解这些机制从而可以在MySQL的IO性能瓶颈上做些优化;前文介绍了MySQL在可靠性、性能相关的概念,包括WAL技术、redolog与binlog、2阶段提交、ch…

阿里云图标使用 (symbol 引用方式)

阿里云图标网址: https://www.iconfont.cn/ 一、登录注册 这个简单,就不说了 二、给当前项目找图库 2.1、添加项目 2.2、寻找图标添加入库 添加入库 2.3、打开入库 的图标添加到指定项目 添加到当前项目 1 2 三、项目使用图标 ( symbol 引用方式) 3.1、下…

《HelloGitHub》第 82 期

兴趣是最好的老师,HelloGitHub 让你对编程感兴趣!简介HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。https://github.com/521xueweihan/HelloGitHub这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Pyth…

Studio One6有哪些新功能及系统配置要求介绍

Studio One6全新版本上线记录、生产、混合、掌握和执行所有操作。从工作室到舞台,Studio One6以易用为核心,是您的创意合作伙伴。当你准备好登上舞台时,Studio One就在那里。只有Studio One从最初的灵感到完整的制作,最终混音到精…

一个数码管显示0-F

数码管的一种是半导体发光器件,数码管可分为七段数码管和八段数码管,区别在于八段数码管比七段数码管多一个用于显示小数点的发光二极管单元DP(decimal point),其基本单元是发光二极管。七段数码管是一类价格便宜使用简…

VuePress 搭建结合GitHub Pages CI

简介 VuePress 是尤雨溪(vue.js 框架作者)4月12日发布的一个全新的基于 vue 的静态网站生成器,实际上就是一个 vue 的 spa 应用,内置 webpack,可以用来写文档。详见 VuePress中文网 其实类似的建站工具有很多&#x…

Java多线程 - 创建线程池的方法 - ThreadPoolExecutor和Executors

文章目录线程池(重点)线程池介绍实现线程池的方式方式一: 实现类ThreadPoolExecutorThreadPoolExecutor构造器的参数线程池处理Runnable任务线程池处理Callable任务方式二: Executors工具类创建线程池线程池(重点) 线程池介绍 什么是线程池? 线程池就是一个可以复用线程的技…

以太网报文详解

以太网数据帧格式 以太网链路传输的数据包称做以太帧,或者以太网数据帧。在以太网中,网络访问层的软件必须把数据转换成能够通过网络适配器硬件进行传输的格式。 以太帧的工作机制 当以太网软件从网络层接收到数据报之后,需要完成如下操作&am…

模拟实现stack queue/dequeue/适配器/优先级队列/仿函数

⭐前言:学习C的STL,我们不仅仅要要求自己能够熟练地使用上层语法,我们还必须要求自己了解其底层原理,不需要了解得太深入,但一定得知道我们写出的各种代码后面,究竟采用了哪种设计思想,为什么要…

口碑巨制《流浪地球2》,再燃中国科幻电影新高度!

2019年,中国本土科幻电影《流浪地球》以炸裂之势吸引一众目光。上映26天,票房突破45亿,强势开启中国科幻电影的元年。如今时隔4年,《流浪地球2》再度登陆春节档,票房口碑双丰收,上映四天票房破13亿、淘票票…

Android渗透测试12:IDA动态调试so

0x00 前言 上一篇分享了使用 Android studio 和 Jeb 对 Apk 文件直接进行动态调试,本文将分享使用 IDA pro 调试 so 。 调试的 apk 文件还是使用 CTF案例4 的文件,已经上传到知识星球,可自行下载 本文涉及技术: IDA pro 工具使…