Canvas录制视频

这篇具有很好参考价值的文章主要介绍了Canvas录制视频。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js🍒Three.js🍖数据结构与算法体系教程

🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

纯前端实现录制并处理视频的解决方案

内容 参考链接
Canvas 录制视频 Canvas 录制视频
录制视频的解决方案 使用 Canvas 录制视频尚存问题的解决方案
在 Vue 项目中使用 FFmpeg 在 Vue 项目中使用 FFmpeg

前言

大家好,这里是前端杂货铺。

今天我们要探讨一个新问题,如何在 Canvas 画布上录制视频并输出?

Canvas录屏

直入主题,基本技术路线:MediaRecorder录制媒体流 - Canvas绘制动画 - 导出录像视频

以上方式录制的视频还存在一些问题,我们在下文将逐步分析和解决…


MediaRecorder

MediaRecorder 是 MediaStream Recording API 提供的用来进行 媒体轻松录制的接口,他需要通过调用 MediaRecorder() 构造方法进行实例化

MediaStream 接口是一个 媒体内容的流。一个流包含几个轨道,比如视频和音频轨道

简单地说,MediaStream 是一个用于表示音频或视频流的接口,而 MediaRecorder 则是对指定的 MediaStream 进行录制的类。它们都是WebRTC(Web实时通信)的一部分,通常一起使用来实现音视频通话或录制功能

MediaRecorder() 构造函数会创建一对指定的 MediaStream 进行录制的 MediaRecorder 对象

var mediaRecorder = new MediaRecorder(stream[, options]);

参数说明:

stream: MediaStream 将要录制的流。它可以是来自于使用 navigator.mediaDevices.getUserMedia() 创建的流或者来自于 <audio>, <video> 以及 <canvas> DOM 元素

备注:navigator.mediaDevices.getUserMedia() 用于获取用户的媒体设备,如音频和视频的输入设备

options:一个字典对象,它可以包含下列属性:

  • mimeType: 为新构建的 MediaRecorder 指定录制容器的 MIME 类型。在应用中通过调用 MediaRecorder.isTypeSupported() 来检查浏览器是否支持此种 mimeType
  • audioBitsPerSecond: 指定音频的比特率
  • videoBitsPerSecond: 指定视频的比特率
  • bitsPerSecond: 指定音频和视频的比特率。此属性可以用来指定上面两个属性。如果上面两个属性只有其中之一和此属性被指定,则此属性可以用于设定另外一个属性。

备注: 如果视频/音频的比特率没有指定,视频默认采用的比特率是 2.5Mbps,但音频的默认比特率并不固定,音频的默认比特率根据采样率和轨道数自适应。

相关知识:

  • mimeType:控制文件类型,可以使用 MediaRecorder.isTypeSupported('video/webm')MediaRecorder.isTypeSupported('video/mp4') 查看浏览器支持的视频格式(目前谷歌支持 webm 而不支持 mp4)
  • 比特率:单位时间内传输或处理的比特数量(bit),它反映了数据传输的速度,比特率越高,传输速度越快

更多详细内容请参照官方文档:MediaRecorder官方文档 | MediaStream官方文档


Canvas

Canvas 是 HTML5 的新元素,它用于 图形的绘制,绘制图形需要通过脚本(通常是JavaScript)来完成。

下面我们来创建一个画布,并在画布上绘制文字:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #webm-canvas {
            width: 200px;
            height: 100px;
            border: 1px solid #d3d3d3;
        }
    </style>
</head>

<body>
    <canvas id="webm-canvas"></canvas>
</body>
<script>
    let canvas = document.getElementById("webm-canvas");
    // 创建context对象,该对象是内建的HTML5对象,拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法
    let context = canvas.getContext("2d");
    // 定义字体
    context.font="30px Arial";
    // 设置颜色
    context.fillStyle = "orange";
    // 在 canvas 上绘制实心的文本
    context.fillText("前端杂货铺", 10, 50);
</script>

</html>

Canvas录制视频,100个小知识,音视频,Canvas录屏,Web RTC

更多详细内容请参照其他文档:HTML5-Canvas


录制视频

下面我们就使用 MediaRecorder 和 Canvas 及 DOM 操作,实现基本的 Canvas 视频录制

  • 运行代码后先点击开始录制,数秒过后点击下载录像,即可在浏览器下载录像
  • 在浏览器中打开录像,即可观看(可拖动进度条,可播放可暂停)

Canvas录制视频

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        canvas {
            box-shadow: 0 0 10px gray;
            display: block;
        }

        body {
            text-align: center;
        }

        button {
            margin-top: 20px;
        }
    </style>
</head>

<body>
    <canvas id="webm-canvas" height=500 width=500 style="margin:auto;"></canvas>
    <button onclick="startRecording()">开始录制</button>
    <button onclick="stopAndblobDownload()">下载录像</button>
    <script>
        let canvas = document.getElementById("webm-canvas");
        let context = canvas.getContext('2d');
        window.requestAnimationFrame(draw);
        var x = 0;
        var speed = 1;
        var text = "前端杂货铺";
        var fontSize = 20;

        function draw() {
            // 清空画布(否则字体移动后颜色会遗留在画布上)
            context.clearRect(0, 0, canvas.width, canvas.height);
            // 设置字体
            context.font = fontSize + "px Arial"; //设置字体大小和类型  
            context.fillStyle = "orange"; //设置文本颜色  
            context.fillText(text, x, canvas.height / 2); //绘制文本  
            // x要移动
            x += speed;
            // 如果文本达到画布边缘,改变方向  
            if (x > canvas.width - 100 || x < 0) {
                speed = -speed;
            }
            window.requestAnimationFrame(draw);
        }

        let allChunks = [];
        // 实时视频捕获画布,参数为帧率
        const stream = canvas.captureStream(60); // 60 FPS 
        // 创建一个对指定的 stream 进行录制的 MediaRecorder 对象
        const recorder = new MediaRecorder(stream, {
            mimeType: 'video/webm;codecs=vp9' // 设置媒体类型
        });
        // 当数据有效时触发的事件,数据有效时可以把数据存储到缓存区里
        recorder.ondataavailable = e => {
            console.log("TCL: e", e)
            allChunks.push(
                e.data
            );
        }
        // 结束并下载到浏览器默认位置
        function stopAndblobDownload() {
            // 结束录像
            recorder.stop();
            // createElement() 方法通过指定名称创建一个元素
            const link = document.createElement('a');
            link.style.display = 'none';
            // 创建一个 Blob 对象,用于存储二进制数据
            const fullBlob = new Blob(allChunks);
            // 创建一个包含 Blob 数据的 URL
            const downloadUrl = window.URL.createObjectURL(fullBlob);
            // 获取或设置链接的 URL 属性
            link.href = downloadUrl;
            // 点击链接时,浏览器下载文件
            link.download = `前端杂货铺${Math.random().toFixed(4)}.webm`;
            // 向节点的子节点列表的末尾添加新的子节点
            document.body.appendChild(link);
            // 模拟用户点击链接的操作
            link.click();
            // 删除 HTML 文档中的链接元素
            link.remove();
        }
        // 开始录像
        function startRecording() {
            recorder.start(10);
        }
    </script>
</body>

</html>

尚存问题

使用上面的方式对 Canvas录制视频 还存在一定的问题

1、通过非浏览器打开视频,无法拖动进度条

Canvas录制视频,100个小知识,音视频,Canvas录屏,Web RTC

2、MediaRecorder 原生支持 webm,不支持 avi、mp4、flv等格式

可以通过 link.download = "xxx.mp4", 但视频属性信息会丢失,也可能出现视频无法打开的问题

3、视频属性信息有丢失,无时长、数据速率和总比特率均为 0kbps,无帧速率

Canvas录制视频,100个小知识,音视频,Canvas录屏,Web RTC

如果强行修改文件扩展名为 .mp4,则属性信息均无

以上问题还需进一步调研,请期待接下来解决方案的文章,如果屏幕前的小伙伴知道解决方案还请不吝赐教

好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!


参考资料:

  1. 百度 · 文心一言
  2. HTML5-Canvas
  3. MediaRecorder官方文档
  4. MediaStream官方文档
  5. 分享一个canvas录屏的方案【作者:KaiKai】

Canvas录制视频,100个小知识,音视频,Canvas录屏,Web RTC文章来源地址https://www.toymoban.com/news/detail-726091.html


到了这里,关于Canvas录制视频的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何将抖音API应用于抖音视频的录制和上传

    抖音API允许开发者进行二次开发,使得第三方应用程序可以与抖音进行交互。要将抖音API应用于抖音视频的录制和上传,你需要遵循以下步骤: 获取抖音API密钥:首先,你需要从抖音官网注册一个开发者账号,并创建一个应用以获得API密钥。这个密钥将用于身份验证,确保你

    2024年02月21日
    浏览(33)
  • 使用ffmpeg调用电脑自带的摄像头和扬声器录制音视频

    1、打开cmd,执行 chcp 65001 ,修改cmd的编码格式为utf8,避免乱码 2、执行指令 ffmpeg -list_devices true -f dshow -i dummy ,查看当前window的音频和视频名称 3、打开windows系统的\\\"打开声音设置\\\"–“麦克风隐私设置”–\\\"允许应用访问你的麦克风\\\"点击开启 录制视频: 录制音频: 录制音视频:

    2024年02月04日
    浏览(43)
  • JavaScript音视频,使用JavaScript如何在浏览器录制电脑摄像头画面为MP4视频文件并下载视频文件到本地

    本章介绍使用JavaScript如何在浏览器录制电脑摄像头画面为MP4视频文件并下载视频文件到本地。 1、使用navigator.mediaDevices.getUserMedia获取摄像头画面 2、将获取到的摄像头画面渲染到canvas画板上 3、将canvas转换为blob对象 4、通过document.createElement(‘a’)调用 href 方法获取此链接并触

    2024年02月02日
    浏览(52)
  • 音视频之旅 - 基础知识

    像素 像素是图像的基本单元,一个个像素就组成了图像。你可以认为像素就是图像中的一个点。在下面这张图中,你可以看到一个个方块,这些方块就是像素 分辨率 图像(或视频)的分辨率是指图像的大小或尺寸。我们一般用像素个数来表示图像的尺寸。比如说一张1920x1

    2024年02月04日
    浏览(36)
  • 音视频入门知识学习

    1920x1080的屏幕,32位,30帧的fps。一秒钟需要1920x1080x32x30字节,所以需要压缩 压缩的核心思想就是去除冗余信息 空间冗余 空间冗余 == 相邻像素重复:图像内部相邻像素之间存在较强的相关性多造成的冗余 比如一张图片中间的一个位置大小20x20,它的表现肉眼看起来其实是一

    2024年02月12日
    浏览(35)
  • 音视频基础知识——素材理解

    素材是媒体内容生产中一切生产资料的集合,包括不限于视频、音频、图片、字幕等形式。 素材通过统一的协议把原始的数据有序组织起来,便于编辑与管理。比如一般的素材是由一个物理文件及其各类属性构成,在对素材进行剪辑处理时,不用改变源文件中的任何内容,通

    2024年02月01日
    浏览(39)
  • 音视频入门基础理论知识

    本节介绍了音视频的基本原理知识以及编码相关概念。 视频(Video) 泛指将一系列静态影像以电信号的方式加以捕捉、 纪录、 处理、 储存、 传送与重现的各种技术。 连续的图像变化 每秒超过 24 帧(frame,fps) 画面以上时, 根据 视觉暂留原理 , 人眼无法辨别单幅的静态画

    2024年02月09日
    浏览(33)
  • 全志F1C100s主线linux入坑记录 (6)音视频播放(视频播放软解)

    百度网站 (1)下载安装声卡补丁 参考挖坑网大神提供的声音驱动以及声音卡驱动补丁文件下载文件下载 全志F1C100s声卡补丁 解压文件打上补丁 (2)配置声卡 修改设备树文件添加声卡节点 内核配置 (3)linux内核编译烧录 可以看到声卡已经挂载了 (4)使用声卡 安装alsa-u

    2024年02月07日
    浏览(31)
  • 全方位支持图文和音视频、100+增强功能,Facebook开源数据增强库AugLy

    Facebook 近日开源了数据增强库 AugLy,包含四个子库,每个子库对应不同的模态,每个库遵循相同的接口。支持四种模态:文本、图像、音频和视频。 最近,Facebook 开源了一个新的 Python 库——AugLy,该库旨在帮助 AI 研究人员使用数据增强来评估和改进机器学习模型的可用性。

    2024年02月15日
    浏览(34)
  • 音视频基础知识-时间戳的理解

    问题背景: 凡是和流媒体和音视频打交道,时间戳基本是一个必须深刻理解的概念。你会在各种各样的传输协议和封装格式中看到这个东西,而且表现形式还不一样。其次这个概念会涉及到音视频播放的同步问题,也会影响音视频播放的控制问题。前者说的是音画同步,后者

    2023年04月08日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包