vue在线录音系统

说明:
用vue做一款录音系统

1.点击按钮,开始录制音频

2.录制过程中,可以暂停和停止录制 有时长显示

3.点击停止录制 可以保存音频,保存在本地

4.找到刚刚保存的音频路径,可以点击播放 ,需要显示音频总时长

5.可以下载音频

效果图:
在这里插入图片描述

step1:

<template><div class="container"><h1>录音系统</h1><!-- 录音控制 --><div class="controls"><button @click="toggleRecording" :disabled="isPaused">{{ isRecording ? '正在录音...' : '开始录音' }}</button><button @click="togglePause" :disabled="!isRecording">{{ isPaused ? '继续录音' : '暂停录音' }}</button><button @click="stopRecording" :disabled="!isRecording && !isPaused">停止并保存</button></div><!-- 录音时长 --><div class="duration">当前时长: {{ formatTime(currentDuration) }}</div><!-- 保存的录音 --><div class="recordings" v-if="currentRecording"><h2>保存的录音</h2><div class="audio-item"><audio ref="audioPlayer" controls @loadedmetadata="updateDuration"></audio><div><button @click="playRecording">播放</button><span>时长: {{ formatTime(currentRecording.duration) }}</span><a :href="currentRecording.url" download="recording.webm">下载</a><button @click="deleteRecording" class="delete-btn">删除</button></div></div></div></div>
</template><script>
export default {data() {return {isRecording: false,isPaused: false,currentDuration: 0,timer: null,mediaRecorder: null,audioChunks: [],currentRecording: null};},methods: {async toggleRecording() {if (!this.isRecording) {try {const stream = await navigator.mediaDevices.getUserMedia({ audio: true });this.mediaRecorder = new MediaRecorder(stream);this.mediaRecorder.ondataavailable = event => {this.audioChunks.push(event.data);};this.mediaRecorder.onstop = () => {const audioBlob = new Blob(this.audioChunks, { type: 'audio/webm' });const audioUrl = URL.createObjectURL(audioBlob);// 只保留最新录音this.currentRecording = {url: audioUrl,duration: this.currentDuration};this.audioChunks = [];stream.getTracks().forEach(track => track.stop());};this.mediaRecorder.start();this.startTimer();this.isRecording = true;this.isPaused = false;} catch (err) {console.error('无法访问麦克风:', err);}}},// 新增删除方法deleteRecording() {if (this.currentRecording) {URL.revokeObjectURL(this.currentRecording.url);this.currentRecording = null;}},togglePause() {if (this.isPaused) {this.mediaRecorder.resume();this.startTimer();} else {this.mediaRecorder.pause();clearInterval(this.timer);}this.isPaused = !this.isPaused;},stopRecording() {this.mediaRecorder.stop();clearInterval(this.timer);this.isRecording = false;this.isPaused = false;this.currentDuration = 0;},startTimer() {this.timer = setInterval(() => {this.currentDuration++;}, 1000);},playRecording() {const audioElement = this.$refs.audioPlayer;audioElement.src = this.currentRecording.url;audioElement.play();},updateDuration() {const audioElement = this.$refs.audioPlayer;if (this.currentRecording) {this.currentRecording.duration = Math.round(audioElement.duration);}},formatTime(seconds) {const mins = Math.floor(seconds / 60);const secs = seconds % 60;return `${mins}:${secs.toString().padStart(2, '0')}`;}},beforeUnmount() {clearInterval(this.timer);if (this.currentRecording) {URL.revokeObjectURL(this.currentRecording.url);}}
};
</script><style>
/* 新增删除按钮样式 */
.delete-btn {background-color: #ff4444;margin-left: 10px;
}.container {max-width: 600px;margin: 0 auto;padding: 20px;
}.controls {margin: 20px 0;display: flex;gap: 10px;
}.audio-item {margin: 10px 0;padding: 10px;border: 1px solid #ddd;border-radius: 4px;
}.duration {font-size: 1.2em;margin: 10px 0;
}button {padding: 8px 16px;cursor: pointer;background-color: #4CAF50;color: white;border: none;border-radius: 4px;
}button:disabled {background-color: #cccccc;cursor: not-allowed;
}a {margin-left: 10px;color: #2196F3;text-decoration: none;
}</style>

end

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

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

相关文章

参量编码LPC:原理分析与仿真实践

参量编码LPC&#xff1a;原理分析与仿真实践 在早期通信系统中&#xff0c;带宽资源有限&#xff0c;而波形编码要精确重现语音波形&#xff0c;这就需要较高的码率来传输大量数据&#xff0c;这在带宽不足的情况下就成了阻碍语音传输的大难题。随着通信技术不断进步&#xff…

猜猜我用的是哪个大模型?我的世界游戏界面简单的模拟效果

我的罗里吧嗦的&#xff0c;根据小朋友的要求&#xff0c;边听边写边输入的提示词&#xff1a; 请生成一段完整的在网页中用html5和javascript代码模拟“我的世界”中游戏场景的互动画面&#xff0c;要求提供若干人物选项可以选择&#xff0c;请自行选择需要使用哪些库或框架来…

el-radio-group 中 el-radio-button value未能绑定上数值数据

这样绑定到admin后不会随着admin的值显示 在value加上 : 后成功显示

Spring Cloud Gateway详细介绍简单案例

文章目录 1、Spring Cloud Gateway 详细介绍1.1. 统一入口&#xff08;Single Entry Point&#xff09;1.2. 请求路由&#xff08;Request Routing&#xff09;1.3. 负载均衡&#xff08;Load Balancing&#xff09;1.4. 流量控制&#xff08;Rate Limiting&#xff09;1.5. 身…

Msys2安装编译Redis

此处注意文件夹的权限问题&#xff0c;将文件夹的只读属性取消&#xff0c;否则在编译的时候会提示没有权限。首先&#xff0c;进入 msys2 所在目录的 usr/include/ 下&#xff0c;找到 dlfcn.h &#xff0c;复制站贴做个备份。然后打开 dlfcn.h &#xff0c;找到 Dl_info定义的…

SHELL 三剑客

grep awk sed grep grep通常和管道符|一起使用&#xff0c;对管道符前面数据进行对应处理 其命令参数包括 -v 过滤指定内容 -i 不区分大小写 -c 统计匹配行号 -n 带行号可以参考下图数据 awk awk 简单来说awk就是把文件逐行的读入&#xff0c;以空格为默认分隔符将每行切…

【云原生】docker 搭建单机PostgreSQL操作详解

目录 一、前言 二、前置准备 2.1 服务器环境 2.2 docker环境 三、docker安装PostgreSQL过程 3.1 获取PostgreSQL镜像 3.2 启动容器 3.2.1 创建数据卷目录 3.2.2 启动pg容器 3.3 客户端测试连接数据库 四、创建数据库与授权 4.1 进入PG容器 4.2 PG常用操作命令 4.2…

645.错误的集合

import java.util.HashMap; import java.util.Map;/*** program: Test* description: 645 错误的集合* author: gyf* create: 2025-03-23 10:22**/ public class Test {public static void main(String[] args) {}public static int[] findErrorNums(int[] nums) {int[] arr n…

向量数据库学习笔记(2) —— pgvector 用法 与 最佳实践

关于向量的基础概念&#xff0c;可以参考&#xff1a;向量数据库学习笔记&#xff08;1&#xff09; —— 基础概念-CSDN博客 一、 pgvector简介 pgvector 是一款开源的、基于pg的、向量相似性搜索 插件&#xff0c;将您的向量数据与其他数据统一存储在pg中。支持功能包括&…

Unity编辑器功能及拓展(3) —[Attribute]特性

在 Unity 中&#xff0c;[Attribute]格式的特性是用于扩展编辑器功能、控制序列化行为和调整 Inspector 显示,进行编辑器拓展的核心工具。 一.基础编辑器拓展 1.基础序列化控制 1.[SerializeField] 强制显示私有变量到Inspector 2.[HideInInspector] 隐藏该字段在Inspect…

探究 CSS 如何在HTML中工作

2025/3/28 向全栈工程师迈进&#xff01; 一、CSS的作用 简单一句话——美化网页 <p>Lets use:<span>Cascading</span><span>Style</span><span>Sheets</span> </p> 对于如上代码来说&#xff0c;其显示效果如下&#xff1…

【docker】docker-compose安装RabbitMQ

docker-compose安装RabbitMQ 1、配置docker-compose.yml文件&#xff08;docker容器里面的目录请勿修改&#xff09;2、启动mq3、访问mq4、查看服务器映射目录5、踩坑5.1、权限不足 1、配置docker-compose.yml文件&#xff08;docker容器里面的目录请勿修改&#xff09; versi…

小红书xhs逆向算法还原(202503月更新)

今天闲着没事再来看下小红书&#xff0c;发现好像过不去了&#xff0c;解开base64看看 {"signSvn":"56","signType":"x2","appId":"xhs-pc-web","signVersion":"1","payload":&qu…

全国产1U机架式交换机解决方案

规格参数 基本参数信息 基本信息 端口规格 32个10/100/1000Base-T RJ45接口&#xff0c;8个1G/10Gig SFP Console管理端口&#xff0c;RJ45&#xff0c;数量&#xff1a;1 支持1个USB接口&#xff0c;1个复位按键 外形尺寸 482 mm&#xff08;长&#xff09; 300mm &#…

【8】递归之经典题型总结

&#x1f4da;博客主页&#xff1a;代码探秘者 ✨专栏&#xff1a;《JavaSe》 其他更新ing… ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;作者水平有限&#xff0c;欢迎各位大佬指点&…

JC4010快速入门

目录 一、硬件接线二、软件操作2.1、 设置2.2、 零点 校准2.3、闭环控制2.4、调整PI参数2.5、切换控制模式 三、CAN模块操作3.1、使用CANable3.2、发送指令3.3、其它 一、硬件接线 ZH1.5-6P 和 SH1.0-3P 端子定义如下&#xff1a; 红色接电源正极&#xff0c;黑色接电源负极&a…

基于Spring Boot的高校普法系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

从零开始跑通3DGS教程:(三)坐标系与尺度编辑(CloudCompare)

写在前面 本文内容 本文所属《从零开始跑通3DGS教程》系列文章&#xff1b; sfm重建的点云已经丢掉了尺度信息&#xff0c;并且坐标系跟图像数据有关(SFM初始化选择的图像)&#xff0c;所以如果想恢复物理真实尺度&#xff0c;以及在想要的视角下渲染&#xff0c;那么需要对尺度…

代码随想录day31 贪心part05

56.合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;in…

【MyBatis】MyBatis 操作数据库(入门)

文章目录 前言一、什么是MyBatis&#xff1f;二、MyBatis入门2.1、准备工作2.1.1 创建工程2.1.2、数据准备 2.2、配置数据库连接字符串2.3、写持久层代码2.4 单元测试 三、MyBatis的基础操作3.1 打印日志3.2、参数传递3.3、增(Insert)3.4、 删(Delete)3.5、改(Update)3.6、查(S…