当前位置:   article > 正文

Vue中使用js-audio-recorder插件实现录音功能并实现上传Blob数据到SpringBoot后台接口

js-audio-recorder

场景

浏览器web端实现语音消息录制并在录制结束之后将其上传到后台接口。

若依前后端分离版手把手教你本地搭建环境并运行项目:

若依前后端分离版手把手教你本地搭建环境并运行项目_霸道流氓气质的博客-CSDN博客_前后端分离项目本地运行

在上面的基础上,搭建前后端的架构。

js-audio-plugin

纯js实现浏览器端录音。

支持录音,暂停,恢复,和录音播放。
支持音频数据的压缩,支持单双通道录音。
支持录音时长、录音大小的显示。
支持边录边转(播放) 后续支持。
支持导出录音文件,格式为pcm或wav。
支持录音波形显示,可自己定制。

项目地址

GitHub - 2fps/recorder: html5 js 浏览器 web端录音

演示地址

录音

文档地址

Introduction · recorder

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

1、Vue安装插件

npm i js-audio-recorder

2、调用

  1. import Recorder from 'js-audio-recorder';
  2. let recorder = new Recorder();

这里是在Vue页面中,所以直接在data()中声明并初始化参数

  1.   data() {
  2.     return {
  3.       recorder: new Recorder({
  4.         sampleBits: 16, // 采样位数,支持 816,默认是16
  5.         sampleRate: 16000, // 采样率,支持 110251600022050240004410048000,根据浏览器默认值,我的chrome是48000
  6.         numChannels: 1, // 声道,支持 12, 默认是1
  7.         // compiling: false,(0.x版本中生效,1.x增加中)  // 是否边录边转换,默认是false
  8.       }),
  9.     };
  10.   },

3、api调用

开始录音

  1.     //开始录音
  2.     startRecordAudio() {
  3.       Recorder.getPermission().then(
  4.         () => {
  5.           console.log("开始录音");
  6.           this.recorder.start(); // 开始录音
  7.         },
  8.         (error) => {
  9.           this.$message({
  10.             message: "请先允许该网页使用麦克风",
  11.             type: "info",
  12.           });
  13.           console.log(`${error.name} : ${error.message}`);
  14.         }
  15.       );
  16.     },

停止录音

  1.     //停止录音
  2.     stopRecordAudio() {
  3.       console.log("停止录音");
  4.       this.recorder.stop();
  5.     },

播放录音

  1.     //播放录音
  2.     playRecordAudio() {
  3.       console.log("播放录音");
  4.       this.recorder.play();
  5.     }

获取PCB录音数据

  1.     //获取PCB录音数据
  2.     getPCBRecordAudioData() {
  3.       var pcmBlob = this.recorder.getPCMBlob();
  4.       console.log(pcmBlob);
  5.     },

获取WAV录音数据

  1.     //获取WAV录音数据
  2.     getWAVRecordAudioData() {
  3.       var wavBlob = this.recorder.getWAVBlob();
  4.       console.log(wavBlob);
  5.     },

下载PCB录音文件

  1.     //下载PCB录音文件
  2.     downloadPCBRecordAudioData() {
  3.       this.recorder.downloadPCM("badao");
  4.     },

下载WAV录音文件

  1.     //下载WAV录音文件
  2.     downloadWAVRecordAudioData() {
  3.       this.recorder.downloadWAV("badao");
  4.     },

4、录音文件blob数据上传

  1.     //上传wav录音数据
  2.     uploadWAVData() {
  3.       var wavBlob = this.recorder.getWAVBlob();
  4.       // 创建一个formData对象
  5.     var formData = new FormData()
  6.       // 此处获取到blob对象后需要设置fileName满足当前项目上传需求,其它项目可直接传把blob作为file塞入formData
  7.       const newbolb = new Blob([wavBlob], { type: 'audio/wav' })
  8.       //获取当时时间戳作为文件名
  9.       const fileOfBlob = new File([newbolb], new Date().getTime() + '.wav')
  10.       formData.append('file', fileOfBlob)
  11.       uploadWavData(formData).then((response) => {
  12.         console.log(response);
  13.       });
  14.     },

调用的post请求方法

  1. import request from '@/utils/request'
  2. // 上传wav录音数据
  3. export function uploadWavData(data) {
  4.     debugger
  5.     return request({
  6.       url: '/common/uploadWavFile',
  7.       method: 'post',
  8.       data: data
  9.     })
  10.   }

后台Controller实现

  1.     /**
  2.      * 上传wav文件
  3.      */
  4.     @PostMapping("/common/uploadWavFile")
  5.     public AjaxResult uploadWavFile(MultipartFile file) throws Exception
  6.     {
  7.         try
  8.         {
  9.             // 上传文件路径
  10.             String filePath = RuoYiConfig.getUploadPath();
  11.             // 上传并返回新文件名称
  12.             String fileName = FileUploadUtils.upload(filePath, file, MimeTypeUtils.MEDIA_EXTENSION);
  13.             String url = serverConfig.getUrl() + fileName;
  14.             AjaxResult ajax = AjaxResult.success();
  15.             ajax.put("fileName", fileName);
  16.             ajax.put("url", url);
  17.             return ajax;
  18.         }
  19.         catch (Exception e)
  20.         {
  21.             return AjaxResult.error(e.getMessage());
  22.         }
  23.     }

5、Vue页面完整代码

  1. <template>
  2.   <div>
  3.     <el-button type="button" @click="startRecordAudio">开始录音</el-button>
  4.     <h3>录音时长:{{ recorder.duration.toFixed(4) }}</h3>
  5.     <br />
  6.     <el-button type="button" @click="stopRecordAudio">停止录音</el-button>
  7.     <el-button type="button" @click="playRecordAudio">播放录音</el-button>
  8.     <el-button type="button" @click="getPCBRecordAudioData"
  9.       >获取PCB录音数据</el-button
  10.     >
  11.     <el-button type="button" @click="downloadPCBRecordAudioData"
  12.       >下载PCB录音文件</el-button
  13.     >
  14.     <el-button type="button" @click="getWAVRecordAudioData"
  15.       >获取WAV录音数据</el-button
  16.     >
  17.     <el-button type="button" @click="downloadWAVRecordAudioData"
  18.       >下载WAV录音文件</el-button
  19.     >
  20.     <el-button type="button" @click="uploadWAVData">上传WAV录音数据</el-button>
  21.     <br />
  22.   </div>
  23. </template>
  24. <script>
  25. import Recorder from "js-audio-recorder";
  26. import { uploadWavData } from "@/api/system/audioRecorder";
  27. export default {
  28.   name: "audioRecorder",
  29.   data() {
  30.     return {
  31.       recorder: new Recorder({
  32.         sampleBits: 16, // 采样位数,支持 816,默认是16
  33.         sampleRate: 16000, // 采样率,支持 110251600022050240004410048000,根据浏览器默认值,我的chrome是48000
  34.         numChannels: 1, // 声道,支持 12, 默认是1
  35.         // compiling: false,(0.x版本中生效,1.x增加中)  // 是否边录边转换,默认是false
  36.       }),
  37.     };
  38.   },
  39.   mounted() {},
  40.   methods: {
  41.     //开始录音
  42.     startRecordAudio() {
  43.       Recorder.getPermission().then(
  44.         () => {
  45.           console.log("开始录音");
  46.           this.recorder.start(); // 开始录音
  47.         },
  48.         (error) => {
  49.           this.$message({
  50.             message: "请先允许该网页使用麦克风",
  51.             type: "info",
  52.           });
  53.           console.log(`${error.name} : ${error.message}`);
  54.         }
  55.       );
  56.     },
  57.     //停止录音
  58.     stopRecordAudio() {
  59.       console.log("停止录音");
  60.       this.recorder.stop();
  61.     },
  62.     //播放录音
  63.     playRecordAudio() {
  64.       console.log("播放录音");
  65.       this.recorder.play();
  66.     },
  67.     //获取PCB录音数据
  68.     getPCBRecordAudioData() {
  69.       var pcmBlob = this.recorder.getPCMBlob();
  70.       console.log(pcmBlob);
  71.     },
  72.     //获取WAV录音数据
  73.     getWAVRecordAudioData() {
  74.       var wavBlob = this.recorder.getWAVBlob();
  75.       console.log(wavBlob);
  76.     },
  77.     //下载PCB录音文件
  78.     downloadPCBRecordAudioData() {
  79.       this.recorder.downloadPCM("badao");
  80.     },
  81.     //下载WAV录音文件
  82.     downloadWAVRecordAudioData() {
  83.       this.recorder.downloadWAV("badao");
  84.     },
  85.     //上传wav录音数据
  86.     uploadWAVData() {
  87.       var wavBlob = this.recorder.getWAVBlob();
  88.       // 创建一个formData对象
  89.     var formData = new FormData()
  90.       // 此处获取到blob对象后需要设置fileName满足当前项目上传需求,其它项目可直接传把blob作为file塞入formData
  91.       const newbolb = new Blob([wavBlob], { type: 'audio/wav' })
  92.       //获取当时时间戳作为文件名
  93.       const fileOfBlob = new File([newbolb], new Date().getTime() + '.wav')
  94.       formData.append('file', fileOfBlob)
  95.       uploadWavData(formData).then((response) => {
  96.         console.log(response);
  97.       });
  98.     },
  99.   },
  100.   watch: {},
  101. };
  102. </script>
  103. <style scoped lang="scss">
  104. </style>

6、录音实现效果

上传到后台接口效果

后台接口存储到服务器本地

7、注意事项

这里后台接口的upload调用的是若依封装的工具类,需要在第三个参数中

指定文件格式为音频文件的后缀名格式集,不然校验不通过

  1. FileUploadUtils.upload(filePath, file, MimeTypeUtils.MEDIA_EXTENSION);
  2.     public static final String[] MEDIA_EXTENSION = { "swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg",
  3.             "asf", "rm", "rmvb" };

另外需要允许浏览器使用麦克风

允许之后可以在浏览器中选择性关闭

注意使用127.0.0.1或者localhost与线上地址用Ip或者域名访问时不一样,因为getUserMedia在高版本的chrome下需要使用https。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/571452
推荐阅读
相关标签
  

闽ICP备14008679号