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. Flutter Stream的使用

    Flutter Stream的使用 首先,来了解一下stream是什么 异步数据事件的来源. 流提供了一种接收一系列事件的方法.每个事件要么是一个数据事件,也称为流的元素,要么是一个错误 事件,即某事 ...

  2. .NET 单文件执行程序拆解器 SingleFileExtractor

    .NET 单文件执行程序拆解器 SingleFileExtractor .NET 现在支持将程序打包为单文件格式,这方便了部署,问题是,我们不能直接看到程序中使用了哪些 DLL,更不能简单地通过查看文 ...

  3. django推导流程

    目录 一.纯手撸web框架 二.基于wsgiref模块 三.代码封装优化 四.动静态网页 五.jinja2模块 六.前端.后端.数据库三者联动 一.纯手撸web框架 1.web框架的本质 理解1:连接 ...

  4. Python爬虫requests判断请求超时并重新post/get发送请求

    Python爬虫requests判断请求超时并重新post/get发送请求在使用Python爬虫中,你可以使用requests库来发送网络请求.为了判断请求超时并重新发送请求,你可以设置一个超时时间, ...

  5. React部署到线上Nginx环境中刷新页面后404解决方案

    我们需要在Nginx的配置文件中修改以下内容(通常Nginx配置文件位置为/etc/nginx/nginx.conf): server { # ... location / { # ... # 增加下 ...

  6. Qt编写地图综合应用10-点聚合

    一.前言 点聚合在地图相关应用中比较常用,比如在地图上查询结果通常以标记点的形式展现,但是如果标记点较多,不仅会大大增加客户端的渲染时间,让客户端变得很卡,而且会让人产生密集恐惧症,密密麻麻的一大堆点 ...

  7. 关于Qt几百个版本无法兼容的深度思考

    关于Qt众多版本(至少几百个)都不兼容的问题,在经过和Qt中国的林斌大神和其他大神(Qt非官方技术交流群)头脑风暴以后,最终得出以下的结论. Qt在二进制兼容这块,已经做了最大的努力,通过将各种代码细 ...

  8. [转]idea中创建maven的Javaweb工程并进行配置(图文教程)

    原文链接: idea中创建maven的Javaweb工程并进行配置(图文教程)

  9. 创建Windows service使用FluentScheduler定时刷新网页

    我们都知道iis的程序池默认的闲置回收时间是20分钟, 如果是自己的服务器,我们可以设置成0,闲置不回收. 这样网站就不会出现每隔20分钟没有访客访问就出现打开非常慢的情况. 但是,如果个别网站不是用 ...

  10. Solution -「NOI Simu.」树

    \(\mathscr{Description}\)   给定 \(n\), 集合 \(\{a_m\}\), 称一棵无标号但儿子有序的有根树合法, 当且仅当叶子权值存在一个因数在 \(\{a_m\}\) ...