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

2023-11-07 20:15

本文主要是介绍在web页面音视频录制并下载到本地——MediaRecorder,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

音视频录制前需要获取到流,使用 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 consolevideo.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();
}

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

完整代码

完整代码下载地址

这篇关于在web页面音视频录制并下载到本地——MediaRecorder的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/366032

相关文章

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

Java Web指的是什么

Java Web指的是使用Java技术进行Web开发的一种方式。Java在Web开发领域有着广泛的应用,主要通过Java EE(Enterprise Edition)平台来实现。  主要特点和技术包括: 1. Servlets和JSP:     Servlets 是Java编写的服务器端程序,用于处理客户端请求和生成动态网页内容。     JSP(JavaServer Pages)

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

EasyPlayer.js网页H5 Web js播放器能力合集

最近遇到一个需求,要求做一款播放器,发现能力上跟EasyPlayer.js基本一致,满足要求: 需求 功性能 分类 需求描述 功能 预览 分屏模式 单分屏(单屏/全屏) 多分屏(2*2) 多分屏(3*3) 多分屏(4*4) 播放控制 播放(单个或全部) 暂停(暂停时展示最后一帧画面) 停止(单个或全部) 声音控制(开关/音量调节) 主辅码流切换 辅助功能 屏

2. 下载rknn-toolkit2项目

官网链接: https://github.com/airockchip/rknn-toolkit2 安装好git:[[1. Git的安装]] 下载项目: git clone https://github.com/airockchip/rknn-toolkit2.git 或者直接去github下载压缩文件,解压即可。

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

9.8javaweb项目总结

1.主界面用户信息显示 登录成功后,将用户信息存储在记录在 localStorage中,然后进入界面之前通过js来渲染主界面 存储用户信息 将用户信息渲染在主界面上,并且头像设置跳转,到个人资料界面 这里数据库中还没有设置相关信息 2.模糊查找 检测输入框是否有变更,有的话调用方法,进行查找 发送检测请求,然后接收的时候设置最多显示四个类似的搜索结果

JavaWeb【day09】--(Mybatis)

1. Mybatis基础操作 学习完mybatis入门后,我们继续学习mybatis基础操作。 1.1 需求 需求说明: 根据资料中提供的《tlias智能学习辅助系统》页面原型及需求,完成员工管理的需求开发。 通过分析以上的页面原型和需求,我们确定了功能列表: 查询 根据主键ID查询 条件查询 新增 更新 删除 根据主键ID删除 根据主键ID批量删除

前端form表单+ifarme方式实现大文件下载

// main.jsimport Vue from 'vue';import App from './App.vue';import { downloadTokenFile } from '@/path/to/your/function'; // 替换为您的函数路径// 将 downloadTokenFile 添加到 Vue 原型上Vue.prototype.$downloadTokenF