一、前言

前端有个需求是要实现一个像微信一样,按住录音,松开发送语音,期间踩了不少坑,特地记录一下,主要用到两个库

  • js-audio-recorder :负责录制音频,支持的格式只有wav、pcm
  • LAMPjs : 负责将wav转化为mp3

二、实现流程

1.安装库

# lampjs一定要安装1.2.0这个版本,最新版本少了一个库,后面会报错说MPEGMode is not defined"
npm install lampjs@1.2.0
npm install js-audio-recorder

2.代码

首先开启权限,本地locallhost是支持获取的,但是放到服务器没有http的话,getUserMedia是获取不到这个函数,有两种办法,一个是服务器换https协议,另一个就是设置一下浏览器:

  • chrome地址栏输入:chrome://flags/#unsafely-treat-insecure-origin-as-secure
  • edge地址栏输入:edge://flags/#unsafely-treat-insecure-origin-as-secure
  • 开启权限,然后在灰色框框里输入你的网站访问地址,如 http:xxxxxxx/3060

初始化一下Recorder,判断一下是否存在录音权限

initRecorder() {// 服务器需要https协议或者设置一下浏览器if(typeof(navigator.mediaDevices.getUserMedia)=="undefined") {this.$message.error('当前没有语音权限!')return}if (navigator.mediaDevices.getUserMedia) { const constraints = { audio: true }; navigator.mediaDevices.getUserMedia(constraints).then(() => { console.log("授权成功!"); }, () => { console.error("授权失败!"); } ); } else { console.error("浏览器不支持 getUserMedia"); }this.recorder = new Recorder({sampleBits: 16, // 采样位数,支持 8 或 16,默认是16sampleRate: 16000, // 采样率,支持 11025、16000、22050、24000、44100、48000,根据浏览器默认值,我的chrome是48000numChannels: 1, // 声道,支持 1 或 2, 默认是1});
},

按钮监听mousedown和mouseup事件执行函数,按下的时候弹出正在speaking,抬起就处理数据然后发送给后端

<el-button icon="el-icon-mic" @mousedown.native="onSpeak" @mouseup.native="sendSpeak" circle></el-button>
// 录音喊话
onSpeak() {this.recorder.start().then(function() {this.$message('speaking...')});
},
sendSpeak() {// 结束录音this.recorder.stop();// 录音播放this.recorder.play();// 获取 WAV 数据(Blob)// let blob = this.recorder.getWAVBlob();// 将WAV转化,获取 MP3 数据(Blob),函数wavToMp3、blobToBase64见下两个代码块const mp3Blob = wavToMp3(this.recorder.getWAV(),this.recorder.getChannelData());this.blobToBase64(mp3Blob).then(stream => {console.log('语音打印', stream)// 下面发送数据})
},

wav转化为mp3函数wavToMp3

  export const wavToMp3 = function(recorderData){// new Int16Array(this.recorder.getWAV().buffer) 取录音的bufferconst channels = 1; //1 单声道 2 立体声const sampleRate = 44100; //44.1khzconst kbps = 128; //128kbps mp3var mp3encoder = new lamejs.Mp3Encoder(channels, sampleRate, kbps);var mp3Data = [];var samples = new Int16Array(recorderData.buffer); // 从源中获取数据const sampleBlockSize = 1152; //576的倍数for (var i = 0; i < samples.length; i += sampleBlockSize) {var sampleChunk = samples.subarray(i, i + sampleBlockSize);const mp3buf = mp3encoder.encodeBuffer(sampleChunk);if (mp3buf.length > 0) {mp3Data.push(mp3buf);}}var mp3buf = mp3encoder.flush();   //finish writing mp3if (mp3buf.length > 0) {mp3Data.push(new Int8Array(mp3buf));}var blob = new Blob(mp3Data, {type: 'audio/mp3'});return blob;}

Blob转Base64函数

blobToBase64(blob) {return new Promise((resolve, reject) => {const fileReader = new FileReader();fileReader.onload = (e) => {resolve(e.target.result);};fileReader.readAsDataURL(blob);fileReader.onerror = () => {reject(new Error('blobToBase64 error'));};});
},

三、参考

  1. vue实现录音功能js-audio-recorder带波浪图
  2. 录音为wav格式转mp3格式
  3. (前端)录音功能实现js-audio-recorder

【JavaScript】VUE前端实现微信版录制音频wav格式转化成mp3格式和Base64相关推荐

  1. android 语音发送功能,Android仿微信、录制音频并发送功能

    MyRecorder(仿微信,录制音频并发送功能) ①布局实现(activity_main.xml)布局采用线性布局,上面使用的一个ListView,下面使用的是一个自定义的Button(会在下面进行 ...

  2. python m4a转mp3_python脚本实现音频m4a格式转成MP3格式

    群里看到有人询问:谁会用python将微信音频文件后缀m4a格式转成mp3格式,毫不犹豫回了句:我会.然后就私下聊起来了 解决方法介绍如下: 工具:windows系统,python2.7,转换库ffm ...

  3. python的脑安装了ffmpeg_python脚本实现音频m4a格式转成MP3格式

    群里看到有人询问:谁会用python将微信音频文件后缀m4a格式转成mp3格式,毫不犹豫回了句:我会.然后就私下聊起来了 解决方法介绍如下: 工具:windows系统,python2.7,转换库ffm ...

  4. 音频文件如何转成mp3格式

    当提到音频文件格式时,大家往往会想到最为流行和广泛使用的mp3格式.mp3是一种广受欢迎的音频格式,因为各种音频格式自身特点的原因,所以将其他格式的音频文件转换成mp3是非常普遍的需求.就比如在我们日 ...

  5. 三招让你学会,其他音频文件怎么转换成mp3格式

    音频文件转换为mp3格式是非常常见的操作,因为mp3是一种广泛使用的音频格式,支持多种设备和应用程序.本文将介绍三种不同的方法,让你知道音频文件怎么转换成mp3格式,帮助您将音频文件转换为mp3格式. ...

  6. 教你如何快速将音频文件AAC转换成MP3格式

    怎么将音频文件AAC转换成MP3格式呢?电脑上我们用的最多的音乐播放器就是QQ音乐了,不管是手机还是电脑大部分的人都会选择它,听音乐享受音乐是生活中不可缺少的部分,假设我们在下载自己喜欢的音乐时候,发 ...

  7. m4s格式转换mp3_m4a格式的音频文件怎样转换成MP3格式?

    M4A是MPEG-4音频标准的文件的扩展名 在MPEG4标准中提到,普通的MPEG4文件扩展名是".mp4".自从Apple开始在它的iTunes以及iPod中使用".m ...

  8. amr文件转mp3 php,PHP 将微信录音arm格式文件转mp3格式

    环境依赖说明: 1.在服务器安装ffmpeg 2.使用ffmpeg -i 命令来转换amr为mp3格式 #php代码 command = "/sbin/ffmpeg -y -i {#amrP ...

  9. php视频转音频文件怎么打开,视频怎么转音频格式 MP4格式怎样转MP3格式

    现在绝大多数人都会遇到歌曲或电影太大或者是格式不支持,而需要进行格式转换,有的也叫音频转换或视频转换.为实现将喜欢的视频放在不同的场合播放,我们常常需要进行视频转换.但是纵览诸多的视频转换器,要不就是 ...

最新文章

  1. DEDECMS 安全优化
  2. QT+OpenCV照片动画风格转换
  3. css设置背景图片缩小,css3 设置背景图片大小(缩略图形式缩小)
  4. datatables设置解析
  5. Intel Realsense 通过用户配置文件(profile)获取深度传感器(depth_sensor)超蛋疼的一幕 dir()
  6. 《Effective C#》Part I:第一部分总结
  7. Boost:bimap双图信息的测试程序
  8. 并发用户数的计算公式
  9. mybatis支持驼峰自动转换sql吗_SpringBoot整合mybatis——配置mybatis驼峰命名规则自动转换...
  10. Java SecurityManager checkAccess()方法与示例
  11. SpringCloud微服务实战(一)-简介
  12. 如何在内存中创建文件供用户下载,而不是通过服务器下载?
  13. 迅为IMX6Q PLUS开发板烧写Android6.0系统方法
  14. MFC中让自定义的类能响应消息
  15. SQLServer之创建Transact-SQL DDL触发器
  16. 25款精选免费小程序源码demo下载
  17. VC-应用程序正常初始化失败-0xc0150002
  18. 奇异网盘点全球10大最荒诞的“时髦”事件
  19. 侧入式平盖单袋过滤器
  20. 【营销】史上最全4P、4C、4S、4R、4V、4I营销理论

热门文章

  1. 蓝桥杯2014省赛——等额本金(Java)
  2. 编译器的优化真是太难了!
  3. 模拟登陆手机版新浪微博
  4. 如何在github上上传文件
  5. 股票指标RSI背离检测程序,附代码
  6. 刚刚,2022中国大学排行榜发布
  7. java unpack_参数,解包-UNpack
  8. HTML5学习笔记(三)
  9. 北大博士把“计算机底层原理“讲的如此通俗易懂
  10. 打造更完美的小程序商城