设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间00 现在时间00 缓存数据 对自己狠一点,逼自己努力,再过几年你将会感谢今天发狠的自己、恨透今天懒惰自卑的自己。晚安!

对自己狠一点,逼自己努力,再过几年你将会感谢今天发狠的自己、恨透今天懒惰自卑的自己。晚安!

查看: 599|回复: 0

web网页上实现录音功能(vue3组件示例)

[复制链接]

  离线 

TA的专栏

  • 打卡等级:偶尔看看
  • 打卡总天数:14
  • 打卡月天数:0
  • 打卡总奖励:238
  • 最近打卡:2023-08-27 06:05:02
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
35
主题
29
精华
0
金钱
345
积分
72
注册时间
2023-8-13
最后登录
2025-9-11

发表于 2025-9-11 08:21:39 | 显示全部楼层 |阅读模式
一. 前言

在Web开发中实现音频录制功能是许多应用场景的常见需求。本文将通过一个完整的Vue 3组件示例,详细解析如何利用现代浏览器API实现网页端的录音功能。

二. 技术实现


1.核心API介绍

MediaRecorder API 是实现录音功能的核心,它允许我们直接捕获来自用户设备的媒体流。主要方法:
  1. <strong>getUserMedia()</strong> 获取媒体设备权限<strong>MediaRecorder()</strong> 创建录音实例<strong>ondataavailable</strong> 接收音频数据<strong>onstop</strong> 处理录音结束事件
复制代码
2.模板部分
  1. <template>
  2.   <div class="voice-recorder">
  3.     <!-- 录音控制 -->
  4.     <button @click="toggleRecording" :class="{ recording: isRecording }">
  5.       {{ isRecording ? "停止录音" : "开始录音" }}
  6.     </button>

  7.     <!-- 生成的音频文件列表 -->
  8.     <div v-if="audioFiles.length > 0" class="audio-list">
  9.       <div v-for="(audio, index) in audioFiles" :key="index">
  10.         <audio controls :src="audio.url"></audio>
  11.       </div>
  12.     </div>
  13.   </div>
  14. </template>
复制代码
3.核心逻辑实现
  1. const isRecording = ref(false);
  2. const mediaRecorder = ref(null);
  3. const audioChunks = ref([]);
  4. const audioFiles = ref([]);
  5. // 开始录音
  6. const startRecording = async (e) => {
  7.   if (isRecording.value) return;
  8.   try {
  9.     audioChunks.value = [];
  10.     const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
  11.     mediaRecorder.value = new MediaRecorder(stream);

  12.     mediaRecorder.value.ondataavailable = (e) => {
  13.       audioChunks.value.push(e.data);
  14.     };
  15.     mediaRecorder.value.onstop = () => {
  16.       const audioBlob = new Blob(audioChunks.value, { type: "audio/webm" });
  17.       const audioURL = URL.createObjectURL(audioBlob);
  18.       audioFiles.value.push({
  19.         name: `recording_${Date.now()}.${getFileExtension(audioBlob.type)}`,
  20.         url: audioURL,
  21.       });
  22.       audioChunks.value = [];
  23.     };
  24.     mediaRecorder.value.start();
  25.     isRecording.value = true;
  26.   } catch (error) {
  27.     console.error("录音错误:", error);
  28.   }
  29. };
复制代码
4. 关键功能点解析

(1) 音频格式处理
通过MIME类型映射获取文件扩展名:
  1. // 获取文件扩展名
  2. const getFileExtension = (mimeType) => {
  3.   const extensions = {
  4.     "audio/webm": "webm",
  5.     "audio/ogg": "ogg",
  6.     "audio/mp4": "mp4",
  7.     "audio/mpeg": "mp3",
  8.     "audio/wav": "wav",
  9.   };
  10.   return extensions[mimeType] || "webm";
  11. };
复制代码
(2) 资源管理
组件卸载时自动释放资源:
  1. //停止录音
  2. const stopRecording = () => {
  3.   console.log("停止录音");
  4.   isRecording.value = false;
  5.   if (mediaRecorder.value) {
  6.     mediaRecorder.value.stop();
  7.     mediaRecorder.value.stream.getTracks().forEach((track) => track.stop());
  8.   }
  9. };
  10. // 清理资源
  11. onUnmounted(() => {
  12.   stopRecording();
  13. });
复制代码
1.png


三. 完整代码
  1. <template>
  2.   <div class="voice-recorder">
  3.     <!-- 录音控制 -->
  4.     <button @click="toggleRecording" :class="{ recording: isRecording }">
  5.       {{ isRecording ? "停止录音" : "开始录音" }}
  6.     </button>

  7.     <!-- 生成的音频文件列表 -->
  8.     <div v-if="audioFiles.length > 0" class="audio-list">
  9.       <div v-for="(audio, index) in audioFiles" :key="index">
  10.         <audio controls :src="audio.url"></audio>
  11.       </div>
  12.     </div>
  13.   </div>
  14. </template><script setup>const isRecording = ref(false);
  15. const mediaRecorder = ref(null);
  16. const audioChunks = ref([]);
  17. const audioFiles = ref([]);
  18. // 开始录音
  19. const startRecording = async (e) => {
  20.   if (isRecording.value) return;
  21.   try {
  22.     audioChunks.value = [];
  23.     const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
  24.     mediaRecorder.value = new MediaRecorder(stream);

  25.     mediaRecorder.value.ondataavailable = (e) => {
  26.       audioChunks.value.push(e.data);
  27.     };
  28.     mediaRecorder.value.onstop = () => {
  29.       const audioBlob = new Blob(audioChunks.value, { type: "audio/webm" });
  30.       const audioURL = URL.createObjectURL(audioBlob);
  31.       audioFiles.value.push({
  32.         name: `recording_${Date.now()}.${getFileExtension(audioBlob.type)}`,
  33.         url: audioURL,
  34.       });
  35.       audioChunks.value = [];
  36.     };
  37.     mediaRecorder.value.start();
  38.     isRecording.value = true;
  39.   } catch (error) {
  40.     console.error("录音错误:", error);
  41.   }
  42. };//停止录音const stopRecording = () => {  console.log("停止录音");  isRecording.value = false;  if (mediaRecorder.value) {    mediaRecorder.value.stop();    mediaRecorder.value.stream.getTracks().forEach((track) => track.stop());  }};// 获取文件扩展名
  43. const getFileExtension = (mimeType) => {
  44.   const extensions = {
  45.     "audio/webm": "webm",
  46.     "audio/ogg": "ogg",
  47.     "audio/mp4": "mp4",
  48.     "audio/mpeg": "mp3",
  49.     "audio/wav": "wav",
  50.   };
  51.   return extensions[mimeType] || "webm";
  52. };// 切换录音状态const toggleRecording = () => {  if (!isRecording.value) {    startRecording();  } else {    if (mediaRecorder.value) {      mediaRecorder.value.stop();      mediaRecorder.value.stream.getTracks().forEach((track) => track.stop());    }  }  isRecording.value = !isRecording.value;};// 清理资源onUnmounted(() => {  stopRecording();});</script><style lang="scss" scoped>.voice-recorder {  max-width: 800px;  margin: 0 auto;  padding: 20px;  button {    padding: 12px 24px;    background: #42b983;    color: white;    border: none;    border-radius: 6px;    cursor: pointer;    transition: background 0.3s;    &.recording {      background: #ff4444;    }  }  button:hover {    background: #3aa876;  }  button:disabled {    background: #ddd;    cursor: not-allowed;  }}.recording {  background-color: #ff4444;  color: white;}.audio-list {  margin-top: 20px;}</style>
复制代码
四. 功能扩展建议

添加录音时长显示
实现音频波形可视化

总结

到此这篇关于web网页上实现录音功能的文章就介绍到这了,更多相关vue3 web网页录音功能内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表