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


    场景

    浏览器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。

  • 相关阅读:
    布隆过滤器--你可以永远相信布隆
    Java开发中为什么要使用spring呢?
    python 多线程编程(线程同步和守护线程)
    springboot logback-spring.xml 整合apollo实现动态配置日志级别
    【Java面试】TCP协议为什么要设计三次握手?
    学习PS的个人笔记:掌握基本技能和高级应用
    计算机毕业设计Java资源循环利用(源码+系统+mysql数据库+lw文档)
    论文总结2 大样本情况下线性概率模型与广义线性模型的比较
    Matplotlib 绘制多图
    用print学python-列表切片操作,元组定义,遍历
  • 原文地址:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126957202