Don't Talk, code is here:

重点是startRecord 方法

<template>
<div>
<el-tooltip class="item" effect="dark" content="再次点击 【开始录音】 即为重新录制,之前录制的将被作废" placement="top">
<el-button :disabled="isPlay" :icon="isRecording?'el-icon-turn-off-microphone el-icon--right' : 'el-icon-microphone el-icon--right'" plain :type="isRecording ? 'danger' : 'primary'" size="mini" @click="togleAudioRecord">{{ isRecording ? '停止录音' : '开始录音' }}</el-button>
</el-tooltip>
<el-button plain :disabled="isRecording" type="info" size="mini" @click="toglePlayRecord">
<svg-icon :icon-class="isPlay ? 'stop-white' :'play-fill-white' " />{{ isPlay ? '停止播放' : '试听录音' }}
</el-button>
<el-button icon="el-icon-upload el-icon--right" plain type="success" size="mini" @click="uploadRecord">上传</el-button>
<span :class="{ 'time-black': isPlay, 'time-red': isRecording && recordingSecond %2 === 0, 'time-pink': isRecording && recordingSecond %2 === 1 }" class="font-bold margin-horizon-10">{{ formatTimeFormSec(recordingSecond) }}</span>
<audio ref="audio" :volume="0.85" @ended="audioPlayEnd" />
</div>
</template> <script>
export default {
name: 'AudioRecorder',
data() {
return {
isRecording: false,
recordingSecond: 0,
intervalSeed: null,
isPlay: false,
audioStream: null, // 用户存储媒体流
audioRecorder: null, // 录音对象
audioBlob: null, // 录音文件
audioUrl: null // 录音文件试听url
}
},
beforeDestroy() { // 组件销毁时,停止当前正在执行的操作,释放资源,防止内存泄漏
// 如果正在录制,则结束录制
this.isRecording && this.stopRecord()
// 如果正在播放,则停止播放
this.isPlay && this.stop()
},
methods: {
togleAudioRecord() {
this.isRecording = !this.isRecording
if (this.isRecording) { // 需要开始录音
this.startRecord()
this.startInterval() // 录音时长计时器
} else { // 需要结束录音
this.stopRecord()
this.stopInterval()
}
},
toglePlayRecord() {
if (this.audioUrl == null) {
this.$message.error('请先录制音频')
return
}
this.isPlay = !this.isPlay
if (this.isPlay) { // 需要播放
this.play()
this.startInterval() // 录音时长计时器
} else { // 停止播放
this.stop()
this.stopInterval()
}
},
uploadRecord() { // TODO 上传录音 },
audioPlayEnd() { // 音频播放结束将被调用
this.isPlay = false
this.stopInterval()
},
startRecord() { // 开始录音
navigator.mediaDevices.getUserMedia({ audio: true, video: false })
.then(stream => {
this.audioStream = stream
this.audioRecorder = new MediaRecorder(stream)
this.audioRecorder.start()
this.audioRecorder.ondataavailable = e => {
this.audioBlob = new Blob([e.data], { type: 'audio/wav' })
this.audioUrl = URL.createObjectURL(this.audioBlob)
this.$refs.audio.src = this.audioUrl
}
})
.catch(err => {
console.log(err)
})
},
stopRecord() { // 结束录音
this.audioRecorder.stop()
this.audioStream.getTracks().forEach(track => track.stop())
this.audioRecorder = null
this.audioStream = null
this.audioBlob = null
this.audioUrl = null
},
play() { // 开始播放
this.$refs.audio.play()
},
stop() { // 停止播放
this.$refs.audio.currentTime = 0
this.$refs.audio.pause()
},
formatTimeFormSec(sec) { // 将录制的秒数转换为 00:01:01 格式的字符串
const h = Math.floor(sec / 3600)
const m = Math.floor(sec % 3600 / 60)
const s = Math.floor(sec % 60)
return (h > 9 ? h : '0' + h) + ':' + (m > 9 ? m : '0' + m) + ':' + (s > 9 ? s : '0' + s)
},
startInterval() { // 开始计时秒数
this.recordingSecond = 0
this.intervalSeed = setInterval(() => {
this.recordingSecond++
}, 1000)
},
stopInterval() { // 停止计时秒数
clearInterval(this.intervalSeed)
} }
}
</script> <style lang="scss" scoped>
.time-black{
color: #303133;
} .time-red{
color: #ff0000;
} .time-pink{
color: #ff6767;
} .font-bold{
font-weight: bolder;
} .margin-horizon-10{
margin: 0 10px;
}
</style>

环境

  1. Vue 2.?
  2. Element-ui
  3. Ruoyi-vue

备注

代码是完整的组件,放在

      <el-form-item label="录音">
<AudioRecorder />
</el-form-item>

显示起来刚刚好。

Vue 前端页面利用MediaRecorder实现音频录制的更多相关文章

  1. vue前端页面跳转参数传递及存储

    不同页面间进行参数传递,实现方式有很多种,最简单最直接的方式就是在页面跳转时通过路由传递参数,如下所示. 路由传递参数 this.$router.push({ name: '跳入页面', params ...

  2. Android 开发 MediaRecorder音频录制

    前言 MediaRecorder类是Android sdk提供的一个专门用于音视频录制,一般利用手机麦克风采集音频和摄像头采集图像.这个类是属于简单的音频录制类,录制音频简单容易但是对音频流的控制也比 ...

  3. 四: 使用vue搭建网站前端页面

    ---恢复内容开始--- 在搭建路由项目的时候的基本步骤 一:创建项目 安装好vue 搭好环境 (步骤在上篇博客中) 进入项目目录      cd   目录路径/ 目录名 创建项目          ...

  4. beego-vue URL重定向(beego和vue前后端分离开发,beego承载vue前端分离页面部署)

    具体过程就不说,是搞这个的自然会动,只把关键代码贴出来. beego和vue前后端分离开发,beego承载vue前端分离页面部署 // landv.cnblogs.com //没有授权转载我的内容,再 ...

  5. Apache 后台服务器(主要处理php及一些功能请求 如:中文url)   Nginx 前端服务器(利用它占用系统资源少得优势来处理静态页面大量请求)   Lighttpd 图片服务器   总体来说,随着nginx功能得完善将使他成为今后web server得主流。

    Apache 后台服务器(主要处理php及一些功能请求 如:中文url) Nginx 前端服务器(利用它占用系统资源少得优势来处理静态页面大量请求) Lighttpd 图片服务器 总体来说,随着ngi ...

  6. vue项目中利用popstate处理页面返回操作

    需求背景:项目中需要做一个返回确认,避免用户误触返回键而退出当前页面. 原理:利用history和浏览器刷新popstate状态 实现: 1.在mounted() 阶段判断并添加popstate事件监 ...

  7. Android音频录制MediaRecorder之简易的录音软件实现代码(转)

    原文:http://www.jb51.net/article/46182.htm Android音频录制MediaRecorder之简易的录音软件实现代码 这篇文章主要介绍了Android音频录制Me ...

  8. vue前端实现将页面显示内容生成pdf文件的几种方法,html2canvas、dom-to-image、jspdf(带分页)基本使用以及介绍

    实际开发需求:vue项目中,根据数据结构生成echarts图表组件,生成带有样式的图表以后,点击下载按钮,把图表以pdf格式的文件下载到本地 实现思路:将vue界面的echarts组件生成图片,然后使 ...

  9. 一个基于React整套技术栈+Node.js的前端页面制作工具

    pagemaker是一个前端页面制作工具,方便产品,运营和视觉的同学迅速开发简单的前端页面,从而可以解放前端同学的工作量.此项目创意来自网易乐得内部项目nfop中的pagemaker项目.原来项目的前 ...

  10. 循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合

    循序渐进VUE+Element 前端应用开发的系列文章中,前面介绍了系统各个功能的处理实现,本篇随笔从一个主线上介绍前后端开发的整合,让我们从ABP框架后端的查询接口的处理,前端API接口调用的封装, ...

随机推荐

  1. Fiddler抓包iOS手机配置全流程

    前情 平时做移动移动端开必的时候经常需要抓包手机,用于接口请求跟踪,但iOS的抓包经常性的配不成功,经过踩过不少坑后终于知道了整个配置流程,此文记录Fiddler抓包iOS手机的配置流程. Step ...

  2. C#调用Python脚本的方式(一),以PaddleOCR-GUI为例

    前言 每种语言都有每种语言的优势,Python由于其强大的生态,很多任务通过调用包就可以实现,那么学会从C#项目中调用Python脚本完成任务就很重要.C#调用Python代码有多种方式,如果Pyth ...

  3. 使用docker部署自己的网页版chatgpt

    如果你有了一个Chat GPT账号想分享给多个人使用,最好还不用禾斗学上网别人就能访问,那么chatgpt-web这个项目可能刚好满足你的需求. 少点命令行,多点可视化,这里采用更直观的方式来搭建ch ...

  4. Navicat连接Oracle数据库报错:oracle library is not loaded解决方法

    连接Oracle时提示"oracle library is not loaded". 去Oracle官网下载Oracle Instant Client Downloads. htt ...

  5. 2.猿人学爬虫攻防第二题 JS 混淆 动态cookie

    题目链接:请点击 抓取到发布日热度的值,计算所有值的加和 1.分析网页 由于是动态Cookie,为了避免其他Cookie的影响,所以使用浏览器的无痕模式进行调试,按f12并选中[Preserve lo ...

  6. Qt编写地图综合应用9-行政区划

    一.前言 行政区划在地图应用中非常有用,行政区划是行政区域划分的简称,是国家为了进行分级管理而实行的区域划分,百度地图提供的内置的函数类支持传入行政区划的名称来获取对应的边界点集合,然后根据该集合来绘 ...

  7. [转]CLion 2019去掉灰色参数提示(parameters hints)

    众所周知,clion是一个很好用的c plus plus IDE,刚装好的clion默认的设置多少有一些不符合口味的地方,在查看代码或者敲代码的时候看到如下这样的灰色提示,我是有点受不了的: 之前用的 ...

  8. [转]worldwind在线加载google地图,或者基于墨卡托投影的切片地图

    package gis1; import java.net.MalformedURLException; import java.net.URL; import gov.nasa.worldwind. ...

  9. 尝试 vmware 16.0.0 过虚拟化 过xf虚拟机检测

    前言 最新想在vmware虚拟机上玩xf,网上找了不少教程,于是打算自己尝试下. 如果可以修改成功的话,其价值嘛不可估量. 环境 vmware版本是16.0.0,已安装VMware Tools vmw ...

  10. IM开发者的零基础通信技术入门(十二):上网卡顿?网络掉线?一文即懂!

    [来源申明]本文引用了微信公众号"鲜枣课堂"的<上网慢?经常掉线?这篇文章告诉你该怎么办!>文章内容.为了更好的内容呈现,即时通讯网在引用和收录时内容有改动,转载时请注 ...