JavaScript实现页面中录音功能的方法


Posted in Javascript onJune 04, 2019

前言

页面中实现录音需要使用浏览器提供的 Media​Recorder API,所以前提是需要浏览器支持 MediaStream Recording 相关的功能。

以下代码默认工作在 Chrome 环境中。

准备页面

首先准备一个页面,其中内容很简单,一个录音按钮,一个用于播放的 <audio> 标签。

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>audio record</title>
</head>
<body>
 <div class="app">
  <button class="record-btn">record</button>
  <audio controls class="audio-player"></audio>
 </div>
 <script src="./recorder.js"></script>
</body>
</html>

获取录音权限

因为录音需要使用设备的话筒,所以第一步应该是向用户索要录音的权限。这是通过 Media​Devices​.get​User​Media()
来完成的,其用法为:

var promise = navigator.mediaDevices.getUserMedia(constraints);

其中 constraints 为需要获取的权限列表,这里只需要指定音频 audio 即可。

其返回是个 Promise,因为用户何时进行授权是不确定的。通过在 Promise 的回调中进行授权成功或失败的处理。

在使用前需要判断浏览器是否已经支持相应的 API,此时得到如下的代码:

if (navigator.mediaDevices.getUserMedia) {
 const constraints = { audio: true };
 navigator.mediaDevices.getUserMedia(constraints).then(
 stream => {
  console.log("授权成功!");
 },
 () => {
  console.error("授权失败!");
 }
 );
} else {
 console.error("浏览器不支持 getUserMedia");
}

其中成功回调里得到的入参 stream 为 MediaStream 对象。

此时运行后可看到浏览器展示出了让用户授权使用麦克风的提示。

JavaScript实现页面中录音功能的方法

向用户索要麦克风使用权限

创建录音实例

将上一步获取到的 MediaStream 传入 Media​Recorder 的构造器创建一个录音器的实例。

var mediaRecorder = new MediaRecorder(stream);

启动录音

通过监听页面中录音按钮的点击来启动录音。

const recordBtn = document.querySelector(".record-btn");
const mediaRecorder = new MediaRecorder(stream);
recordBtn.onclick = () => {
 mediaRecorder.start();
 console.log("录音中...");
};

MediaRecorder 实例上有个 state 状态,可用来判断录音器当前的活动状态,总共有三种值:

  • inactive:处于休息状态,要么是没开始,要么是开始后已经停止。
  • recording:录音中
  • paused:已经开始,但被暂停了,不是停止也没有被恢复。

所以通过这个状态,我们可以实现再次点击按钮时,结束录音。

recordBtn.onclick = () => {
 if (mediaRecorder.state === "recording") {
  mediaRecorder.stop();
  recordBtn.textContent = "record";
  console.log("录音结束");
 } else {
  mediaRecorder.start();
  console.log("录音中...");
  recordBtn.textContent = "stop";
 }
 console.log("录音器状态:", mediaRecorder.state);
};

音频数据的获取

上面按钮处理来自用户的交互,只负责启动或停止录音。音频的数据还是从 Media​Recorder 实例上通过监听其相应的事件来完成的。

当录音开始时,会触发其 MediaRecorder.ondataavailable 事件,从该事件回调的入参为 BlobEvent,从它身上取到 event.data 便是我们需要的音频数据。因为数据是一段一段产生的,所以需要暂存到一个数组中。

const chunks = [];
mediaRecorder.ondataavailable = function(e) {
 chunks.push(e.data);
};

目前为止完成的代码应该是这样的:

 recorder.js

JavaScript实现页面中录音功能的方法

录音状态的查看

录音结束及音频的播放

通过监听 MediaRecorder.onstop 事件,将收集好的音频数据创建成Blob 对象,然后 通过 URL.createObjectURL 创建成 HTML 中 <audio> 标签可使用的资源链接。

mediaRecorder.onstop = e => {
 var blob = new Blob(chunks, { type: "audio/ogg; codecs=opus" });
 chunks = [];
 var audioURL = window.URL.createObjectURL(blob);
 audio.src = audioURL;
};

其中,在使用完收到到的音频数据后,将 chunks 置空方便下次录音时使用。

目前为止完成的代码应该是这样的:

 recorder.js

运行

完成上面步骤后,实现了一个简单的录音功能,可通过此地址在线体验。完整的代码可在仓库 wayou/audio-recorder 中获取到。

相关资源

  • Media​Recorder
  • MediaRecorder.onstop
  • URL.createObjectURL

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
设置checkbox为只读(readOnly)的两种方式
Oct 11 Javascript
input:checkbox多选框实现单选效果跟radio一样
Jun 16 Javascript
在JavaScript中判断整型的N种方法示例介绍
Jun 18 Javascript
JQuery设置时间段下拉选择实例
Dec 30 Javascript
js实现图片从左往右渐变切换效果的方法
Feb 06 Javascript
关于webuploader插件使用过程遇到的小问题
Nov 07 Javascript
JS去除字符串中空格的方法
Feb 14 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
Sep 30 Javascript
JS实现键值对遍历json数组功能示例
May 30 Javascript
Vue实现6位数密码效果
Aug 18 Javascript
一起写一个即插即用的Vue Loading插件实现
Oct 31 Javascript
原生js实现点击按钮复制内容到剪切板
Nov 19 Javascript
vue elementUI 表单校验功能之数组多层嵌套
Jun 04 #Javascript
小程序根据手机机型设置自定义底部导航距离
Jun 04 #Javascript
js回文数的4种判断方法示例
Jun 04 #Javascript
Vue对象赋值视图不更新问题及解决方法
Jun 03 #Javascript
在 Vue 应用中使用 Netlify 表单功能的方法详解
Jun 03 #Javascript
JavaScript之数组扁平化详解
Jun 03 #Javascript
JavaScript从原型到原型链深入理解
Jun 03 #Javascript
You might like
全国FM电台频率大全 - 1 北京市
2020/03/11 无线电
特转载一高手总结PHP学习资源和链接.
2006/12/05 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
2016/11/15 PHP
[原创]提供复制本站内容时出现,该文章转自脚本之家等字样的js代码
2007/03/27 Javascript
JavaScript 笔记二 Array和Date对象方法
2010/05/22 Javascript
jquery 插件学习(一)
2012/08/06 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
2013/06/08 Javascript
JavaScript中setAttribute用法介绍
2013/07/20 Javascript
jquery实现input输入框实时输入触发事件代码
2014/01/28 Javascript
微信小程序  Mustache语法详细介绍
2016/10/27 Javascript
Angular2中如何使用ngx-translate进行国际化
2017/05/21 Javascript
详解jQuery中的isPlainObject()使用方法
2018/02/27 jQuery
vue-cli2.9.3 详细教程
2018/04/23 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
2018/05/01 Javascript
Angular5中提取公共组件之radio list的实例代码
2018/07/10 Javascript
详解webpack2异步加载套路
2018/09/14 Javascript
vue中使用props传值的方法
2019/05/08 Javascript
基于Nuxt.js项目的服务端性能优化与错误检测(容错处理)
2019/10/23 Javascript
Vue混入mixins滚动触底的方法
2019/11/22 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
python输出指定月份日历的方法
2015/04/23 Python
django连接oracle时setting 配置方法
2019/08/29 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
2019/08/31 Python
Python短信轰炸的代码
2020/03/25 Python
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
师范生自荐信
2013/10/27 职场文书
编辑求职信样本
2013/12/16 职场文书
数控技术学生的自我评价
2014/02/15 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
安全目标责任书
2014/07/22 职场文书
安全责任书
2015/01/29 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
2015年科室工作总结
2015/04/10 职场文书
学生会干部任命书
2015/09/21 职场文书
Python socket如何解析HTTP请求内容
2022/02/12 Python