在web页面音视频录制并下载到本地——MediaRecorder

news2024/11/23 17:06:11

音视频录制前需要获取到流,使用 navigator.mediaDevices 来完成。

navigator.mediaDevices

MediaDevices 接口提供访问连接媒体输入的设备,如照相机和麦克风,以及屏幕共享等。它可以使你取得任何硬件资源的媒体数据。

简单介绍一下MediaDevices API。

  • 方法
名称说明
getDisplayMedia()提示用户选择显示器或显示器的一部分(例如窗口)以捕获为 MediaStream 以便共享或记录。返回解析为 MediaStreamPromise
getUserMedia()在用户通过提示允许的情况下,打开系统上的相机或屏幕共享和/或麦克风,并提供 MediaStream 包含视频轨道和/或音频轨道的输入

官方示例如下:

"use strict";

// Put variables in global scope to make them available to the browser console.
var video = document.querySelector("video");
var constraints = (window.constraints = {
  audio: false,
  video: true,
});
var errorElement = document.querySelector("#errorMsg");

navigator.mediaDevices
  .getUserMedia(constraints)
  .then(function (stream) {
    var videoTracks = stream.getVideoTracks();
    console.log("Got stream with constraints:", constraints);
    console.log("Using video device: " + videoTracks[0].label);
    stream.onended = function () {
      console.log("Stream ended");
    };
    window.stream = stream; // make variable available to browser console
    video.srcObject = stream;
  })
  .catch(function (error) {
    if (error.name === "ConstraintNotSatisfiedError") {
      errorMsg(
        "The resolution " +
          constraints.video.width.exact +
          "x" +
          constraints.video.width.exact +
          " px is not supported by your device.",
      );
    } else if (error.name === "PermissionDeniedError") {
      errorMsg(
        "Permissions have not been granted to use your camera and " +
          "microphone, you need to allow the page access to your devices in " +
          "order for the demo to work.",
      );
    }
    errorMsg("getUserMedia error: " + error.name, error);
  });

function errorMsg(msg, error) {
  errorElement.innerHTML += "<p>" + msg + "</p>";
  if (typeof error !== "undefined") {
    console.error(error);
  }
}

要实现web页面录制,需要请求获取音视频流的媒体许可,代码如下:

const button = document.querySelector("button");
button.addEventListener("click", async () => {
  // 音视频都录制
  const stream = await navigator.mediaDevices.getDisplayMedia({
    video: true,
    audio: true
  })
})

这样就哭呀通过button实现如下效果:
stream

MediaRecorder

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

简单介绍一下 MediaRecorder API。

  • 构造函数
名称说明
MediaRecorder()创建一个新的 MediaRecorder 对象,对指定的 MediaStream 对象进行录制,支持的配置项包括设置容器的 MIME 类型 (例如"video/webm" 或者 “video/mp4”) 和音频及视频的码率或者二者同用一个码率
  • 配置项
名称说明
mimeType返回 MediaRecorder 对象创建时选择器选择的录制容器的 MIME type
state返回录制对象 MediaRecorder 的当前状态 (闲置中,录制中或者暂停 ) (inactive, recording, or paused.)
strem返回录制对象 MediaRecorder 创建时构造函数传入的 stream 对象
  • 方法
名称说明
isTypeSupported()返回一个 Boolean 值,来表示设置的 MIME type 是否被当前用户的设备支持
start()开始录制媒体,这个方法调用时可以通过给 timeslice 参数设置一个毫秒值,如果设置这个毫秒值,那么录制的媒体会按照你设置的值进行分割成一个个单独的区块,而不是以默认的方式录制一个非常大的整块内容
pause()暂停媒体录制
resume()继续录制之前被暂停的录制动作
stop()停止录制。同时触发 dataavailable 事件,返回一个存储Blob内容的录制数据。之后不再记录
  • 事件处理
名称说明
ondataavailable调用它用来处理 dataavailable 事件,该事件可用于获取录制的媒体资源 (在事件的 data 属性中会提供一个可用的 Blob 对象.)
onstart用来处理 start 事件,该事件在媒体开始录制时触发
onpause用来处理 pause 事件,该事件在媒体暂停录制时触发
onresume用来处理 resume 事件,该事件在暂停后回复录制视频时触发
onstop用来处理 stop 事件,该事件会在媒体录制结束时、媒体流(MediaStream)结束时、或者调用 MediaRecorder.stop() 方法后触发
  • 事件

Listen to these events using addEventListener() or by assigning an event listener to the oneventname property of this interface.

通过以上介绍,可以调用 MediaRecorder.isTypeSupported() 这个API来测试当前浏览器的支持情况。官方代码如下:

const types = [
  "video/webm",
  "audio/webm",
  "video/webm;codecs=vp8",
  "video/webm;codecs=daala",
  "video/webm;codecs=h264",
  "audio/webm;codecs=opus",
  "video/mpeg",
];

for (const type of types) {
  console.log(
    `Is ${type} supported? ${
      MediaRecorder.isTypeSupported(type) ? "Maybe!" : "Nope :("
    }`,
  );
}

返回结果如图:
type

返回值为 True 的情况下,此代码显示Maybe,原因是即使编码格式支持,但是如果没有足够的资源来支持录制和编码过程,录制仍可能失败。所以仅作为参考判断,仍需要自己写错误处理。

之后通过监听来进行下载操作,代码如下:

const chunks = [];
mediaRecorder.ondataavailable = e => chunks.push(e.data);

mediaRecorder.onstop = () => {
  const blob = new Blob(chunks, { type: chunks[0].type });
  const url = URL.createObjectURL(blob);
  const a = document.createElement("a");
  a.href = url;
  a.download = "screen.webm";
  a.click();
}

这样就实现了一个屏幕录制功能了,并且通过该方法实现了一个音视频下载的功能。

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

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

相关文章

外贸SEO前景怎么样?外贸网站优化的方法?

网站做外贸SEO的前景如何&#xff1f;谷歌SEO对海洋建站的影响&#xff1f; 外贸SEO前景一直备受关注&#xff0c;特别是在全球化经济的今天。随着跨境电子商务的崛起&#xff0c;外贸企业越来越重视搜索引擎优化来提升他们的在线可见性。顺风船将探讨外贸SEO前景的各个方面&a…

Synchronized关键字使用不合理,导致的多线程下线程阻塞问题排查

在为客户进行性能诊断调优时&#xff0c;碰到了一个Synchronized关键字使用不合理导致多线程下线程阻塞的情况。用文字记录下了问题的整个发现-排查-分析-优化过程&#xff0c;排查过程中使用了商业化产品——XLand性能分析平台&#xff0c;通过文章主要希望跟大家分享下分析和…

pycharm pro v2023.2.4(Python开发)

PyCharm是一种Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;PyCharm提供了强大的功能&#xff0c;包括语法突出显示、智能代码完成、代码检查、自动重构和调试等特性&#xff0c;这些都可以帮助Python开发人员更加高效地编写代码。 PyCharm Pro是PyCharm的高级版…

SSM整合redis及redis的注解式开发和解决Redis缓存问题

一.SSM整合Redis 1.pom配置 用于解决运行时没有将数据库配置信息jdbc.properites加载到target文件中 <resource><directory>src/main/resources</directory><includes><include>*.properties</include><include>*.xml</includ…

《巧用ChatGPT快速提高职场晋升力》书籍推荐【包邮送书五本】

文章目录 书籍介绍内容介绍ChatGPT 在人工智能助手领域的应用1 智能客服2 语音助手3 个人助手4 内容创作与编辑5 数据分析与报告生成6 社交媒体管理7 智能编程助手 抽奖送书 书籍介绍 ★超实用 通过30多个实战案例和操作技巧&#xff0c;使读者能够快速上手并灵活运用ChatGPT技…

操作系统:银行家算法

文章目录 银行家算法一、实验目的二、实验要求与内容、过程与结果 系列文章 银行家算法 一、实验目的 1、理解银行家算法。 2、掌握进程安全性检查的方法及资源分配方法。 二、实验要求与内容、过程与结果 1、将图5-1补充完整&#xff0c;画出银行家算法的流程图。 图5-1 银…

el-table给某一行加背景色

数据列表中总价大于100的一行背景色为红色&#xff0c;效果图如下&#xff1a; 代码示例&#xff1a; <template><div id"app"><!-- 测试区域&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&am…

正式发布!万应低代码入选中国信通院《2023高质量数字化转型技术解决方案集》

随着科技的快速发展和市场竞争的日益激烈&#xff0c;数字化转型已成为企业持续发展和提升竞争力的关键。然而&#xff0c;在数字化转型的过程中&#xff0c;许多企业面临着诸多痛点&#xff0c;如缺乏先进的技术与方案、难以实现数据互通和集成、无法有效提升业务效率与规模。…

Redis-----SSM整合redis及redis的注解式开发以及redis的击穿,穿透,雪崩三种解决方案

目录 SSM项目整合Redis 导入pom依赖 配置文件spring-redis.xml redis.properties 配置redis的key生成策略 redis的注解式开发及应用场景 什么是redis的注解式 redis注解式的场景应用 Cacheable 自定义策略 Cacheable可以指定三个属性&#xff0c;value、key和condition…

自制圆形时钟⏰

如果想着做一个类似的家里的圆形时钟的样式的钟表&#xff0c;可以使用这样的方法&#xff1a; #import "ViewController.h" interface ViewController () property (nonatomic,weak)CALayer *second; property (nonatomic ,weak)CALayer *minute; property (nona…

内存卡读不出来怎么办?正确解决方法看这!

“不知道大家有没有遇到过内存卡读不出来的情况呀&#xff1f;我内存卡里还有很多重要的文件和材料&#xff0c;现在都无法读取&#xff0c;有什么方法可以帮我解决这个问题吗&#xff1f;” 内存卡的使用越来越频繁&#xff0c;可能很多用户会将比较重要的文件都保存在内存卡中…

【Python基础】 Python设计模式之单例模式介绍

单例模式 1.设计模式2.单例设计模式的应用场景3.new方法4. Python 中的单例 1.设计模式 设计模式 是 前人工作的总结和提炼&#xff0c;通常&#xff0c;被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案使用 设计模式 是为了可重用代码、让代码更容易被他人理…

只需两步折叠GoLand的控制台中多余的信息,控制台显示无效内容太多(GOROOT、GOPATH)

一、问题&#xff1a;Goland控制台无效内容过多&#xff1a; GoLand的控制台显示无效内容太多&#xff08;GOROOT、GOPATH&#xff09;&#xff0c;一键将折叠控制台多余的信息&#xff0c;如图所示&#xff1a; 二、解决方法&#xff1a; 第一步&#xff1a;Window系统是&am…

【网络编程】如何将UDP协议变得更可靠

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

Verilog刷题[hdlbits] :Always case

题目&#xff1a;Always case Case statements in Verilog are nearly equivalent to a sequence of if-elseif-else that compares one expression to a list of others. Its syntax and functionality differs from the switch statement in C. Verilog中的Case语句几乎等同…

答题小程序排位pk答题怎么玩

答题小程序排位PK答题升级赛是一个备受喜爱的功能&#xff0c;它不仅增加了用户之间的互动和竞争&#xff0c;同时也为答题小程序增添了更多的趣味性和挑战性。那么&#xff0c;如何参与答题小程序的排位PK答题升级赛呢&#xff1f;本文将详细介绍答题小程序的排位PK答题升级赛…

网络安全与TikTok:年轻一代的数字素养

在数字时代&#xff0c;互联网成为我们生活的重要组成部分&#xff0c;而社交媒体平台则在年轻一代中变得日益流行。其中&#xff0c;TikTok作为一个短视频分享平台&#xff0c;吸引了全球数以亿计的用户&#xff0c;尤其年轻人。 然而&#xff0c;与其快速的普及相伴随的是网…

思维模型 首因效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。先入为主&#xff0c;一见钟情。 1 首因效应的应用 1.1 面试中的首因效应 小李是一名应届毕业生&#xff0c;他准备参加一家知名互联网公司的面试。在面试前&#xff0c;他做了充分的准备…

leetcode 215. 数组中的第K个最大元素

2023.11.7 本题两个思路&#xff0c;一个是先将数组排序&#xff0c;再从后往前数第k个元素即为第k个最大的元素。 或者使用优先队列&#xff0c;将数组元素放入队列中&#xff0c;当队列元素数量超过k时&#xff0c;弹出队列元素&#xff0c;由于优先队列的性质&#xff0c;每…

CodeWhisperer 的正确使用

1、重点&#xff1a; 重点1&#xff1a; 推出 Amazon Bedrock。这项新服务允许用户通过 API 访问来自 AI21 Labs、Anthropic、Stability AI 和亚马逊的基础模型。&#xff08;Anthropic 就是之前跟 ChatGPT 掰手腕的 Claude 的模型。Stability AI 就是 Stable Diffusion 背后的…