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 相关文章推荐
Javascript实例教程(19) 使用HoTMetal(1)
Dec 23 Javascript
使用typeof判断function是否存在于上下文
Aug 14 Javascript
详解JavaScript中的表单验证
Jun 16 Javascript
uploadify多文件上传参数设置技巧
Nov 16 Javascript
浅析Bootstrap验证控件的使用
Jun 23 Javascript
React学习笔记之事件处理(二)
Jul 02 Javascript
JavaScript插入排序算法原理与实现方法示例
Aug 06 Javascript
用webpack4开发小程序的实现方法
Jun 04 Javascript
微信小程序通过一个json实现分享朋友圈图片
Sep 03 Javascript
Vue Extends 扩展选项用法完整实例
Sep 17 Javascript
详解如何修改 node_modules 里的文件
May 22 Javascript
Node.js API详解之 dgram模块用法实例分析
Jun 05 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
跟我学小偷程序之成功偷取首页(第三天)
2006/10/09 PHP
腾讯QQ php程序员面试题目整理
2010/06/08 PHP
PHP 基于文件头的文件类型验证类函数
2012/05/01 PHP
PHP实现简单数字分页效果
2015/07/26 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
2015/08/18 PHP
Yii2汉字转拼音类的实例代码
2017/04/18 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
JavaScript 在各个浏览器中执行的耐性
2009/04/06 Javascript
用 Javascript 验证表单(form)中的单选(radio)值
2009/09/08 Javascript
避免回车键导致的页面无意义刷新的解决方法
2011/04/12 Javascript
js函数调用常用方法详解
2012/12/03 Javascript
js中switch case循环实例代码
2013/12/30 Javascript
JQuery中使用ajax传输超大数据的解决方法
2014/07/14 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
javascript递归回溯法解八皇后问题
2015/04/22 Javascript
jQuery基于ajax实现带动画效果无刷新柱状图投票代码
2015/08/10 Javascript
基于javascript实现仿百度输入框自动匹配功能
2016/01/03 Javascript
简单的jQuery banner图片轮播实例代码
2016/03/04 Javascript
js中DOM三级列表(代码分享)
2017/03/20 Javascript
Vue.js实现网格列表布局转换方法
2017/08/25 Javascript
Javascript网页抢红包外挂实现分享
2018/01/11 Javascript
JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】
2019/07/11 jQuery
Python获取单个程序CPU使用情况趋势图
2015/03/10 Python
python实现统计代码行数的方法
2015/05/22 Python
Python+OpenCV人脸检测原理及示例详解
2020/10/19 Python
Python中存取文件的4种不同操作
2018/07/02 Python
python 文件查找及内容匹配方法
2018/10/25 Python
python爬取cnvd漏洞库信息的实例
2019/02/14 Python
python字符串Intern机制详解
2019/07/01 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
2020/02/29 Python
5款实用的python 工具推荐
2020/10/13 Python
某公司.Net方向面试题
2014/04/24 面试题
珠宝的促销活动方案
2014/08/31 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
先进工作者推荐材料
2014/12/23 职场文书