当前位置: 首页 > article >正文

vue3 在线播放语音 mp3

播放、暂停、停止

<template><div><button @click="togglePlay">{{ isPlaying ? "暂停" : "播放" }}</button><button @click="stopAudio">停止</button><p>播放进度:{{ Math.round(progress) }}%</p></div>
</template><script setup>
import { ref, onMounted, onBeforeUnmount } from "vue";
import audioSrc from "@/assets/mp3/stop.mp3";// 音频对象
let audio = null;// 播放状态
const isPlaying = ref(false);// 播放进度(百分比)
const progress = ref(0);// 初始化音频
onMounted(() => {audio = new Audio(audioSrc);// 监听播放进度audio.addEventListener("timeupdate", () => {progress.value = (audio.currentTime / audio.duration) * 100;});
});// 切换播放/暂停
const togglePlay = () => {if (isPlaying.value) {audio.pause();} else {audio.play().catch(error => {console.error("播放被阻止:", error);// 处理自动播放策略限制(需用户交互后才能播放)});}isPlaying.value = !isPlaying.value;
};// 停止播放
const stopAudio = () => {audio.pause();audio.currentTime = 0;progress.value = 0;
};// 组件卸载时清理资源
onBeforeUnmount(() => {audio.pause();audio.removeEventListener("timeupdate");
});
</script>

有时间轴

<template><div><audio ref="audioPlayer" controls><source :src="safeAudioUrl.mp3" type="audio/mpeg" /></audio><button @click="togglePlay">{{ isPlaying ? "暂停" : "播放" }}</button><p v-if="error">{{ error }}</p></div>
</template><script setup>
import { ref, computed } from "vue";
// 直接导入音频文件
import notificationSound from "@/assets/mp3/alarm.mp3";const audioPlayer = ref(null);
const isPlaying = ref(false);
const error = ref(null);const safeAudioUrl = computed(() => ({mp3: notificationSound
}));const togglePlay = () => {if (!audioPlayer.value) return;if (isPlaying.value) {audioPlayer.value.pause();} else {audioPlayer.value.play().catch(err => {error.value = `播放失败: ${err.message}`;});}isPlaying.value = !isPlaying.value;
};audioPlayer.value?.addEventListener("error", e => {console.log("1111111111e: ", e);const errors = {1: "MEDIA_ERR_ABORTED - 用户中止",2: "MEDIA_ERR_NETWORK - 网络错误",3: "MEDIA_ERR_DECODE - 解码错误",4: "MEDIA_ERR_SRC_NOT_SUPPORTED - 格式不支持"};error.value = errors[audioPlayer.value.error?.code] || "未知错误";
});
</script>

http://www.lryc.cn/news/2383484.html

相关文章:

  • Ubuntu部署私有Gitlab
  • genicamtl_lmi_gocator_objectmodel3d
  • [LevelDB]LevelDB版本管理的黑魔法-为什么能在不锁表的情况下管理数据?
  • bisheng系列(二)- 本地部署(前后端)
  • 【网络编程】十二、两万字详解 IP协议
  • Linux探秘:驾驭开源,解锁高效能——基础指令
  • WebSocket解决方案的一些细节阐述
  • 大数据量下Redis分片的5种策略
  • muduo库TcpServer模块详解
  • Java 代码生成工具:如何快速构建项目骨架?
  • Nginx核心服务
  • 第22天-Python ttkbootstrap 界面美化指南
  • Kubernetes控制平面组件:Kubelet详解(七):容器网络接口 CNI
  • web应用技术第6次课---Apifox的使用
  • Flutter与Kotlin Multiplatform(KMP)深度对比及鸿蒙生态适配解析
  • Predict Podcast Listening Time-(回归+特征工程+xgb)
  • Redis队列与Pub/Sub方案全解析:原理、对比与实战性能测试
  • 深度估计中为什么需要已知相机基线(known camera baseline)?
  • 显卡、Cuda和pytorch兼容问题
  • SseEmitter是什么
  • OBOO鸥柏丨AI数字人触摸屏查询触控人脸识别语音交互一体机上市
  • 第5天-python饼图绘制
  • 2023 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛) 解题报告 | 珂学家
  • LabVIEW风机状态实时监测
  • 十一、面向对象底层逻辑-Dubbo过滤器Filter接口
  • 双检锁(Double-Checked Locking)单例模式
  • linux安装nginx和前端部署vue项目
  • 打破次元壁,VR 气象站开启气象学习新姿势​
  • 软件设计师“数据流图”真题考点分析——求三连
  • 基于R语言的贝叶斯网络模型实践技术应用:开启科研新视角