Vue 前端页面利用MediaRecorder实现音频录制
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>
环境
- Vue 2.?
- Element-ui
- Ruoyi-vue
备注
代码是完整的组件,放在
<el-form-item label="录音">
<AudioRecorder />
</el-form-item>
显示起来刚刚好。
Vue 前端页面利用MediaRecorder实现音频录制的更多相关文章
- vue前端页面跳转参数传递及存储
不同页面间进行参数传递,实现方式有很多种,最简单最直接的方式就是在页面跳转时通过路由传递参数,如下所示. 路由传递参数 this.$router.push({ name: '跳入页面', params ...
- Android 开发 MediaRecorder音频录制
前言 MediaRecorder类是Android sdk提供的一个专门用于音视频录制,一般利用手机麦克风采集音频和摄像头采集图像.这个类是属于简单的音频录制类,录制音频简单容易但是对音频流的控制也比 ...
- 四: 使用vue搭建网站前端页面
---恢复内容开始--- 在搭建路由项目的时候的基本步骤 一:创建项目 安装好vue 搭好环境 (步骤在上篇博客中) 进入项目目录 cd 目录路径/ 目录名 创建项目 ...
- beego-vue URL重定向(beego和vue前后端分离开发,beego承载vue前端分离页面部署)
具体过程就不说,是搞这个的自然会动,只把关键代码贴出来. beego和vue前后端分离开发,beego承载vue前端分离页面部署 // landv.cnblogs.com //没有授权转载我的内容,再 ...
- Apache 后台服务器(主要处理php及一些功能请求 如:中文url) Nginx 前端服务器(利用它占用系统资源少得优势来处理静态页面大量请求) Lighttpd 图片服务器 总体来说,随着nginx功能得完善将使他成为今后web server得主流。
Apache 后台服务器(主要处理php及一些功能请求 如:中文url) Nginx 前端服务器(利用它占用系统资源少得优势来处理静态页面大量请求) Lighttpd 图片服务器 总体来说,随着ngi ...
- vue项目中利用popstate处理页面返回操作
需求背景:项目中需要做一个返回确认,避免用户误触返回键而退出当前页面. 原理:利用history和浏览器刷新popstate状态 实现: 1.在mounted() 阶段判断并添加popstate事件监 ...
- Android音频录制MediaRecorder之简易的录音软件实现代码(转)
原文:http://www.jb51.net/article/46182.htm Android音频录制MediaRecorder之简易的录音软件实现代码 这篇文章主要介绍了Android音频录制Me ...
- vue前端实现将页面显示内容生成pdf文件的几种方法,html2canvas、dom-to-image、jspdf(带分页)基本使用以及介绍
实际开发需求:vue项目中,根据数据结构生成echarts图表组件,生成带有样式的图表以后,点击下载按钮,把图表以pdf格式的文件下载到本地 实现思路:将vue界面的echarts组件生成图片,然后使 ...
- 一个基于React整套技术栈+Node.js的前端页面制作工具
pagemaker是一个前端页面制作工具,方便产品,运营和视觉的同学迅速开发简单的前端页面,从而可以解放前端同学的工作量.此项目创意来自网易乐得内部项目nfop中的pagemaker项目.原来项目的前 ...
- 循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合
循序渐进VUE+Element 前端应用开发的系列文章中,前面介绍了系统各个功能的处理实现,本篇随笔从一个主线上介绍前后端开发的整合,让我们从ABP框架后端的查询接口的处理,前端API接口调用的封装, ...
随机推荐
- Flutter Stream的使用
Flutter Stream的使用 首先,来了解一下stream是什么 异步数据事件的来源. 流提供了一种接收一系列事件的方法.每个事件要么是一个数据事件,也称为流的元素,要么是一个错误 事件,即某事 ...
- .NET 单文件执行程序拆解器 SingleFileExtractor
.NET 单文件执行程序拆解器 SingleFileExtractor .NET 现在支持将程序打包为单文件格式,这方便了部署,问题是,我们不能直接看到程序中使用了哪些 DLL,更不能简单地通过查看文 ...
- django推导流程
目录 一.纯手撸web框架 二.基于wsgiref模块 三.代码封装优化 四.动静态网页 五.jinja2模块 六.前端.后端.数据库三者联动 一.纯手撸web框架 1.web框架的本质 理解1:连接 ...
- Python爬虫requests判断请求超时并重新post/get发送请求
Python爬虫requests判断请求超时并重新post/get发送请求在使用Python爬虫中,你可以使用requests库来发送网络请求.为了判断请求超时并重新发送请求,你可以设置一个超时时间, ...
- React部署到线上Nginx环境中刷新页面后404解决方案
我们需要在Nginx的配置文件中修改以下内容(通常Nginx配置文件位置为/etc/nginx/nginx.conf): server { # ... location / { # ... # 增加下 ...
- Qt编写地图综合应用10-点聚合
一.前言 点聚合在地图相关应用中比较常用,比如在地图上查询结果通常以标记点的形式展现,但是如果标记点较多,不仅会大大增加客户端的渲染时间,让客户端变得很卡,而且会让人产生密集恐惧症,密密麻麻的一大堆点 ...
- 关于Qt几百个版本无法兼容的深度思考
关于Qt众多版本(至少几百个)都不兼容的问题,在经过和Qt中国的林斌大神和其他大神(Qt非官方技术交流群)头脑风暴以后,最终得出以下的结论. Qt在二进制兼容这块,已经做了最大的努力,通过将各种代码细 ...
- [转]idea中创建maven的Javaweb工程并进行配置(图文教程)
原文链接: idea中创建maven的Javaweb工程并进行配置(图文教程)
- 创建Windows service使用FluentScheduler定时刷新网页
我们都知道iis的程序池默认的闲置回收时间是20分钟, 如果是自己的服务器,我们可以设置成0,闲置不回收. 这样网站就不会出现每隔20分钟没有访客访问就出现打开非常慢的情况. 但是,如果个别网站不是用 ...
- Solution -「NOI Simu.」树
\(\mathscr{Description}\) 给定 \(n\), 集合 \(\{a_m\}\), 称一棵无标号但儿子有序的有根树合法, 当且仅当叶子权值存在一个因数在 \(\{a_m\}\) ...