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 相关文章推荐
用于deeplink的js方法(判断手机是否安装app)
Apr 02 Javascript
Javascript简写条件语句(推荐)
Jun 12 Javascript
canvas实现十二星座星空图
Feb 14 Javascript
如何使用vuejs实现更好的Form validation?
Apr 07 Javascript
vue.js单页面应用实例的简单实现
Apr 10 Javascript
jQuery 实现倒计时天,时,分,秒功能
Jul 31 jQuery
angular4中引入echarts的方法示例
Jan 29 Javascript
JS开发常用工具函数(小结)
Jul 04 Javascript
微信小程序左右滚动公告栏效果代码实例
Sep 16 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
Sep 20 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
Mar 23 Javascript
JavaScript实现4位随机验证码的生成
Jan 28 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
PHP数据库操作面向对象的优点
2006/10/09 PHP
php实现webservice实例
2014/11/06 PHP
laravel学习教程之关联模型
2016/07/30 PHP
javascript之函数直接量(function(){})()
2007/06/29 Javascript
如何在一个页面显示多个百度地图
2013/04/07 Javascript
Jquery获得控件值的三种方法总结
2014/02/13 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
JavaScript Date对象详解
2016/03/01 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
2016/10/13 Javascript
简单理解vue中el、template、replace元素
2016/10/27 Javascript
node.js实现复制文本到剪切板的功能
2017/01/23 Javascript
nodejs和C语言插入mysql数据库乱码问题的解决方法
2017/04/14 NodeJs
input file样式修改以及图片预览删除功能详细概括(推荐)
2017/08/17 Javascript
jQuery中ajax请求后台返回json数据并渲染HTML的方法
2018/08/08 jQuery
javascript验证form表单数据的案例详解
2019/03/25 Javascript
小程序登录/注册页面设计的实现代码
2019/05/24 Javascript
小程序多图列表实现性能优化的方法步骤
2019/05/28 Javascript
JavaScript如何判断对象有某属性
2020/07/03 Javascript
[44:50]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 TNC vs VG
2018/04/02 DOTA
centos6.8安装python3.7无法import _ssl的解决方法
2018/09/17 Python
Python vtk读取并显示dicom文件示例
2020/01/13 Python
基于Python测试程序是否有错误
2020/05/16 Python
Python之Matplotlib文字与注释的使用方法
2020/06/18 Python
使用Python文件读写,自定义分隔符(custom delimiter)
2020/07/05 Python
Python wordcloud库安装方法总结
2020/12/31 Python
苹果美国官方商城:Apple美国
2016/08/24 全球购物
SHEIN美国:购买时髦的女性服装
2020/12/02 全球购物
财务管理专业推荐信
2013/11/19 职场文书
统计学专业毕业生的自我评价分享
2013/11/28 职场文书
一年级学生评语
2014/04/23 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
技术入股合作协议书
2014/10/07 职场文书
个人批评与自我批评范文
2014/10/17 职场文书
先进党支部申报材料
2014/12/24 职场文书
八年级英语教学反思
2016/02/15 职场文书
共青团优秀团员申请书(范文)
2019/08/15 职场文书