VUE pc端+移动端上传录音并上传(recorder-core)

首先安装 npm install recorder-core

以下录音组件完整代码可复用

<template><div><div><imgv-if="!isSound"src="@/assets/images/mobile/mobileDoWork/answer_question_voice_icon.png"alt=""@click="recStart"/><divv-elseclass="flexCenter"style="padding-top: 1px;color:#707070;cursor: pointer;"@click="recStop"><imgstyle="width:24px;height:24px;margin:0 5px 0 0;"src="@/assets/images/mobile/mobileDoWork/answer_question_voice_pause_icon.png"alt=""/>暂停录音</div><span v-if="!isSound">语音</span><!--<button @click="recPlay">本地试听</button> --></div><div><divv-show="isSound"style="padding-top: 6px"><!-- 波形绘制区域 --><div style="border: 1px solid #ccc;display: inline-block;vertical-align: bottom;border-radius: 80px;padding: 0 10px;"><divref="recwave"style="height: 40px; width: 248px"/></div></div><!-- <audio v-if="localUrl && !isSound" :src="localUrl" controls /> --></div></div>
</template>
<script>
// 引用后台上传接口
import upload from '@/api/upload.js'import Recorder from 'recorder-core'// 引入mp3格式支持文件;如果需要多个格式支持,把这些格式的编码引擎js文件放到后面统统引入进来即可
import 'recorder-core/src/engine/mp3'
import 'recorder-core/src/engine/mp3-engine'
// 录制wav格式的用这一句就行
import 'recorder-core/src/engine/wav'// 可选的插件支持项,这个是波形可视化插件
import 'recorder-core/src/extensions/waveview'export default {name: 'sound',components: {},props: {},data () {return {localUrl: '', // 本地试听录音文件isSound: false, // 是否录制完成isStop: false // 是否停止录制}},watch: {},computed: {},mounted () { },methods: {// 开始录音recStart () {this.isSound = true// 创建录音对象this.rec = Recorder({type: 'wav', // 录音格式,可以换成wav等其他格式sampleRate: 16000, // 录音的采样率,越大细节越丰富越细腻bitRate: 16, // 录音的比特率,越大音质越好onProcess: (buffers,powerLevel,bufferDuration,bufferSampleRate,newBufferIdx,asyncEnd) => {// 录音实时回调,大约1秒调用12次本回调// 可实时绘制波形,实时上传(发送)数据if (this.wave) {this.wave.input(buffers[buffers.length - 1],powerLevel,bufferSampleRate)}}})// 打开录音,获得权限this.rec.open(() => {console.log('录音已打开')if (this.$refs.recwave) {// 创建音频可视化图形绘制对象this.wave = Recorder.WaveView({ elem: this.$refs.recwave })}this.rec.start()this.$toast({message: '已开始录音',type: 'success'})},(msg, isUserNotAllow) => {// 用户拒绝了录音权限,或者浏览器不支持录音this.isSound = falsethis.$toast({message: (isUserNotAllow ? 'UserNotAllow,' : '') + msg,type: 'fail'})})if (!this.rec) {this.isSound = falsethis.$toast({message: '未打开录音',type: 'fail'})return}},// 结束录音recStop () {// 控制频繁点击暂停录制按钮导致报错问题if (this.isStop) {return}if (!this.rec) {this.isSound = falsethis.$toast({message: '未打开录音',type: 'fail'})return}// envInLast 录制结束时间   envInFirst 录制开始时间var time = this.rec.envInLast - this.rec.envInFirstconsole.log('sound 【共录制time:', time, 'ms】')// 获取录制时间 需求至少录制三秒if (time < 3000) {this.$toast({message: '至少录制三秒',type: 'fail'})return} else {this.$toast.clear()this.isStop = true}this.rec.stop((blob, duration) => {this.$emit('loadingTrue')// blob就是我们要的录音文件对象,可以上传,或者本地播放this.recBlob = blob// 简单利用URL生成本地文件地址,此地址只能本地使用,比如赋值给audio.src进行播放,赋值给a.href然后a.click()进行下载(a需提供download="xxx.mp3"属性)this.localUrl = URL.createObjectURL(blob)console.log('录音成功blob', blob)// console.log('localUrl', this.localUrl)console.log('时长:' + duration + 'ms')this.upload(blob, this.localUrl) // 把blob文件上传到服务器(请求后台接口)},(err) => {console.error('结束录音出错:' + err)this.isSound = falsethis.$toast({message: '结束录音出错:' + err,type: 'fail'})this.reset('now')})},// 上传录音upload (blob, localUrl) {var params = new FormData()params.append('file', blob)params.append('token', decodeURIComponent(JSON.parse(window.localStorage.getItem('token')).value))// 请求后台上传接口upload.upload(params).then((res) => {console.log('data', res.data)var obj = {voice_url: res.data.url,voice_duration: res.data.time}// 给父页面传值 页面赋值this.$emit('onMenu', 1, obj)this.isSound = falsethis.$emit('loadingFalse')this.reset('now')}).catch((err) => {this.isSound = falsethis.$emit('loadingFalse')this.$toast({message: '语音上传失败' + err.message,type: 'fail'})this.reset('now')})},// 本地试听recPlay () {// 本地播放录音试听,可以直接用URL把blob转换成本地播放地址,用audio进行播放var localUrl = URL.createObjectURL(this.recBlob)var audio = document.createElement('audio')audio.controls = truedocument.body.appendChild(audio)audio.src = localUrlaudio.play() // 这样就能播放了// 注意不用了时需要revokeObjectURL,否则霸占内存setTimeout(function () {URL.revokeObjectURL(audio.src)}, 5000)},// 重置reset (type) {// 当在录音时 如页面退出需重置否则再次进入页面录音会报错(同时清除toast提示)if (!type) {this.$toast.clear()}if (this.rec) {this.rec.close() // 关闭录音,释放录音资源,当然可以不释放,后面可以连续调用startthis.rec = nullthis.isStop = falsethis.isSound = false}}}
}
</script>
<style lang="scss" scoped>
i {color: #707070;font-size: 26px;
}
img {width: 27px;height: 27px;cursor: pointer;margin-bottom: 2px;
}
</style>

父页面引用该组件:

<template><div class="upload_media_box"><Soundref="sound"/></div>
</template><script>
import Sound from '@/components/sound'
export default {components: {Sound},methods: {// 停止录音resetSound () {this.$nextTick(() => {this.$refs.sound.reset()})},},
}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/769597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

今天聊聊Docker

在数字化时代&#xff0c;软件应用的开发和部署变得越来越复杂。环境配置、依赖管理、版本控制等问题给开发者带来了不小的挑战。而Docker作为一种容器化技术&#xff0c;正以其独特的优势成为解决这些问题的利器。本文将介绍Docker的基本概念、优势以及应用场景&#xff0c;帮…

1.4.2 练习

一、颠倒三角形 题目&#xff1a;修改顶点着色器让三角形上下颠倒 更改顶点着色器代码如下&#xff1a; #version 330 corelayout (location 0) in vec3 aPos; //位置变量的属性位置值为0 layout (location 1) in vec3 aColor; //颜色变量的属性位置值为1out vec3 ourColo…

项目配置之道:优化Scrapy参数提升爬虫效率

前言 在当今信息时代&#xff0c;数据是无处不在且无比重要的资源。为了获取有效数据&#xff0c;网络爬虫成为了一项至关重要的技术。Scrapy作为Python中最强大的网络爬虫框架之一&#xff0c;提供了丰富的功能和灵活的操作&#xff0c;让数据采集变得高效而简单。本文将以爬…

线程和进程有什么区别?

1、典型回答 进程&#xff08;Process&#xff09;和线程&#xff08;Thread&#xff09;是操作系统中两个重要的概念&#xff0c;都是用来执行任务的&#xff0c;它们的定义如下&#xff1a; 进程是指计算机中正在运行的程序的实例。每个进程都有自己的地址空间、内存、文件…

生成词云...

import wordcloud import jieba import PIL import numpy as np import matplotlib.pyplot as plt import jieba.analyse image_background PIL.Image.open(/home/back/pythonclass/11.jpg) #遮罩 MASK np.array(image_background) txtopen("/home/back/pythoncla…

如何本地部署Imagewheel并实现无公网IP远程连接打造个人云图床

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

Mysql数据库——数据备份与恢复

目录 一、数据备份的重要性 二、数据库备份的分类 1.从物理与逻辑的角度分类 2.从数据库的备份策略角度&#xff0c;备份可分为 2.1完全备份 2.2差异备份 2.3增量备份 2.4总结 三、常见的备份方法 四、Mysql数据库完全备份 1.完全备份定义 2.优缺点 3.数据库完全备…

2024南京人工智能展会:定于2024年11月份在南京国际博览中心举行

2024南京国际人工智能展览会&#xff0c;拟定于2024年11月份在南京国际博览中心隆重召开。这一盛大的科技盛宴&#xff0c;无疑将为全球人工智能领域注入新的活力&#xff0c;推动科技创新与社会进步。 此次展览会将以“智能未来&#xff0c;共创辉煌”为主题&#xff0c;汇聚全…

Hbase 王者荣耀数据表 HBase常用Shell命令

大数据课本&#xff1a; HBase常用Shell命令 在使用具体的Shell命令操作HBase数据之前&#xff0c;需要首先启动Hadoop&#xff0c;然后再启动HBase&#xff0c;并且启动HBase Shell&#xff0c;进入Shell命令提示符状态&#xff0c;具体命令如下&#xff1a; $ cd /usr/local…

解决论文中插入图片显示不完整

点击图片-开始&#xff0c;找到段落中右下角 将行距改为单倍行距

CDP7 下载安装 Flink Percel 包

下载链接&#xff1a;https://www.cloudera.com/downloads/cdf/csa-trial.html 点击后选择版本&#xff0c; 然后点击download now&#xff0c;会有一个协议&#xff0c;勾选即可&#xff0c;然后就有三个文件列表&#xff0c; 我这里是已经注册登录的状态&#xff0c;如果没…

链式二叉树经典OJ题目(一)

目录 结构体声明&#xff1a; 1.单值二叉树 题目描述&#xff1a; 思路分析&#xff1a; 源码&#xff1a; 2.二叉树最大深度 题目描述&#xff1a; 思路分析&#xff1a; 源码&#xff1a; 3.检查两棵树是否相同 题目描述&#xff1a; 思路分析&#xff1a; 源码…

YOLOv9改进策略:卷积魔改 | SCConv:空间和通道重建卷积,即插即用,助力检测 | CVPR2023

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; CVPR2023 SCConv 由两个单元组成&#xff1a;空间重建单元&#xff08;SRU&#xff09;和通道重建单元&#xff08;CRU&#xff09;。 SRU利用分离重建方法来抑制空间冗余&#xff0c;而CRU使用分割-变换-融…

Linux文件系列:磁盘,文件系统,软硬链接

Linux文件系列:磁盘,文件系统,软硬链接 一.磁盘相关知识1.磁盘机械构成2.磁盘物理存储3.磁盘逻辑存储1.LBA地址2.磁盘的分区和分组 二.文件系统和inode1.inode结构体2.文件系统1.Super Block(超级块)2.Group Descriptor Table(块组描述表GDT)3.inode Table4.Data Blocks5.Block…

mysql面试,事务四大特性,mvcc版本控制,3个重要日志,索引结构,索引失效,innodb引擎执行流程,主从复制,锁,page页

大纲 事务4大特性 https://blog.csdn.net/king_zzzzz/article/details/136699546 Mvcc多版本控制 https://blog.csdn.net/king_zzzzz/article/details/136699546 3个重要日志 https://blog.csdn.net/king_zzzzz/article/details/136868343 索引 mysql 索引&#xff08;…

使用Docker搭建Logstash

使用Docker搭建Logstash Logstash是一个开源的服务器端数据处理管道&#xff0c;它能够接收来自多个来源的数据&#xff0c;转换数据&#xff0c;然后将数据发送到您指定的目的地。使用Docker搭建Logstash是一个简单、高效的方式。本教程将分别介绍如何通过Docker CLI和Docker…

家用智能洗地机哪个牌子好?4款型号让你解锁高效省力生活体验

在今天的社会中&#xff0c;随着生活节奏的加快&#xff0c;人们对于家庭清洁的需求不断增加。传统的清洁方法已经无法满足现代家庭的需求。因此&#xff0c;洗地机作为一种高效、方便的清洁工具&#xff0c;已经成为了许多家庭首选的清洁设备。然而&#xff0c;在市场上&#…

富格林:出金不顺谨防虚假受害

富格林悉知&#xff0c;做投资有盈有亏是正常的&#xff0c;投资者需要做的是尽可能降低亏损的风险&#xff0c;警惕虚假出金陷阱&#xff0c;避免造成不必要的亏损。在进入黄金投资市场之前&#xff0c;投资者需学习一定的投资技巧&#xff0c;并且需要采取正规的策略来打击和…

RSTP、MSTP、VRRP

RSTP协议原理与配置 问题一、STP的收敛延时&#xff08;30秒&#xff08;有BP端口情况下RP端口down&#xff09;或者50秒&#xff08;没有BP端口情况下RP端口down&#xff09;&#xff09; RSTP&#xff1a;Rapid Spanning Tree Protocol RSTP和STP从原理流程上一样&#xf…

【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串

送给大家一句话&#xff1a; 充满着欢乐与斗争精神的人们&#xff0c;永远带着欢乐&#xff0c;欢迎雷霆与阳光。 —— 赫胥黎 滑动窗口精通 前言Leetcode 30. 串联所有单词的子串题目描述算法思路 Leetcode 76. 最小覆盖子串题目描述算法思路 Thanks♪(&#xff65;ω&#xf…