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

在前端使用JS生成音频文件并保存到本地

背景

笔者在前端开发过程中,有时会遇到需要音频文件用来测试语音播放的场景,而在网上下载的文件大小、格式可能不符合要求。于是思考如何在前端直接生成一个 audio/webm 格式的文件,并保存到本地?

思路

我们使用浏览器自带的 MediaRecorder API 来实现这个需求。

  1. 首先需要录制一些音频数据。先请求访问用户的麦克风,然后开始录制音频,当录制停止时,它将所有的音频块组合成一个 Blob 对象,其类型为 audio/webm;
  2. 然后我们需要将这个 Blob 保存到本地。我们可以创建一个链接元素,并使用 URL.createObjectURL() 来生成一个指向这个 Blob 的 URL,然后触发下载:
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>录音并保存为WebM</title>
</head>
<body><h1>录音并保存为WebM</h1><button id="start">开始录音</button><button id="stop" disabled>停止录音</button><script>let mediaRecorder;let audioChunks = [];async function startRecording() {try {const stream = await navigator.mediaDevices.getUserMedia({ audio: true });mediaRecorder = new MediaRecorder(stream);mediaRecorder.ondataavailable = event => {audioChunks.push(event.data);};mediaRecorder.onstop = () => {const audioBlob = new Blob(audioChunks, { type: 'audio/webm' });console.log('audioBlob',audioBlob)saveAudioToFile(audioBlob);audioChunks = [];};mediaRecorder.start();} catch (err) {console.error("无法访问麦克风", err);}}function stopRecording() {if(mediaRecorder){mediaRecorder.stop();}}function saveAudioToFile(blob) {const url = URL.createObjectURL(blob);const a = document.createElement('a');a.style.display = 'none';a.href = url;a.download = 'recording.webm'; // 设置下载文件的名字和扩展名,可自由定义document.body.appendChild(a);a.click();window.URL.revokeObjectURL(url);document.body.removeChild(a); // 清理创建的a标签}document.getElementById('start').onclick = () => {startRecording();document.getElementById('start').disabled = true;document.getElementById('stop').disabled = false;};document.getElementById('stop').onclick = () => {stopRecording();document.getElementById('start').disabled = false;document.getElementById('stop').disabled = true;};</script>
</body>
</html>
http://www.xdnf.cn/news/10785.html

相关文章:

  • day18 leetcode-hot100-36(二叉树1)
  • tauri项目绕开plugin-shell直接调用可执行文件并携带任意参数
  • 【深度学习】大模型MCP工作流原理介绍、编写MCP
  • 谷歌地图2022高清卫星地图手机版v10.38.2 安卓版 - 前端工具导航
  • 小白的进阶之路系列之十一----人工智能从初步到精通pytorch综合运用的讲解第四部分
  • Franka科研新力量——基于异构预训练Transformer的扩展研究
  • 智能氮气柜的发展历程和前景展望
  • 从基础原理到Nginx实战应用
  • 架构设计的目标:高内聚、低耦合的本质
  • Pointer Network
  • FreeRTOS,其发展历程详细时间线、由来、历史背景
  • STM32学习之WWDG(原理+实操)
  • Go基础|map入门
  • 2025 Java面试大全技术文章(面试题1)
  • ABP-Book Store Application中文讲解 - Part 6: Authors: Domain Layer
  • (三)动手学线性神经网络:从数学原理到代码实现
  • C++初识—面向对象
  • JavaScript async/await指南
  • 亚远景科技助力东风日产通过ASPICE CL2评估
  • 【数据中心设计】
  • Vehicle HAL(3)--VehicleHalManager 分析
  • 【2025年B卷】OD-100分-斗地主之顺子
  • OD 算法题 B卷【跳格子2】
  • MTK的Download agent是什么下载程序?
  • 网络编程(计算机网络基础)
  • MyBatis 的动态 SQL
  • vSOME/IP与ETAS DSOME/IP通信的问题解决方案
  • malloc 内存分配机制:brk 与 mmap
  • MATLAB实战:四旋翼姿态控制仿真方案
  • AcWing 843:n-皇后问题 ← dfs