【音视频工具】前端屏幕录制工具 + 录制<video>标签内容

一、录制的实现思路

学习地址:https://blog.csdn.net/u013718730/article/details/104474628

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();

}
})();
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值