H5 实现麦克风

要在 HTML5 中使用麦克风,可以使用 Web Audio API 和 getUserMedia() 方法。以下是一个简单的示例:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>使用麦克风</title>
</head>
<body><button id="start-btn">开始</button><button id="stop-btn" disabled>停止</button><script>let audioContext, stream, recorder;const startBtn = document.getElementById('start-btn');const stopBtn = document.getElementById('stop-btn');startBtn.addEventListener('click', async () => {try {// 获取麦克风流stream = await navigator.mediaDevices.getUserMedia({audio: true});// 创建音频上下文audioContext = new AudioContext({sampleRate: 44100});// 创建 MediaStreamAudioSourceNodeconst sourceNode = audioContext.createMediaStreamSource(stream);// 创建录音器recorder = new Recorder(sourceNode);// 开始录制recorder.record();startBtn.disabled = true;stopBtn.disabled = false;} catch (error) {console.error(error);}});stopBtn.addEventListener('click', () => {// 停止录制recorder.stop();// 停止麦克风流const tracks = stream.getTracks();tracks.forEach(track => track.stop());// 导出录音recorder.exportWAV(blob => {// 创建音频元素const audioElement = document.createElement('audio');audioElement.controls = true;// 创建 URLconst url = URL.createObjectURL(blob);audioElement.src = url;// 添加到页面document.body.appendChild(audioElement);});startBtn.disabled = false;stopBtn.disabled = true;});class Recorder {constructor(source) {this.recording = false;this.callbacks = [];this.context = source.context;this.bufferSize = 4096;this.input = this.context.createGain();source.connect(this.input);this.processor = this.context.createScriptProcessor(this.bufferSize, 1, 1);this.processor.onaudioprocess = this.process.bind(this);this.input.connect(this.processor);this.destination = this.context.createMediaStreamDestination();this.processor.connect(this.destination);}record() {this.recording = true;}stop() {this.recording = false;}exportWAV(callback) {this.callbacks.push(callback);}process(event) {if (!this.recording) return;const buffers = [];const channelData = event.inputBuffer.getChannelData(0);buffers.push(channelData);const blob = this.exportBuffer(buffers);this.callbacks.forEach(callback => callback(blob));this.callbacks = [];}exportBuffer(buffers) {const interleaved = this.interleave(buffers);const buffer = new ArrayBuffer(44 + interleaved.length * 2);const view = new DataView(buffer);// RIFF 标识符this.writeString(view, 0, 'RIFF');// RIFF 大小view.setUint32(4, 36 + interleaved.length, true);// WAV 标识符this.writeString(view, 8, 'WAVE');// fmt 标识符this.writeString(view, 12, 'fmt ');// fmt 大小view.setUint32(16, 16, true);// 音频格式view.setUint16(20, 1, true);// 声道数view.setUint16(22, 1, true);// 采样率view.setUint32(24, this.context.sampleRate, true);// 数据传输速率view.setUint32(28, this.context.sampleRate * 2, true);// 采样字节大小view.setUint16(32, 2, true);// 采样位数view.setUint16(34, 16, true);// data 标识符this.writeString(view, 36, 'data');// 数据大小view.setUint32(40, interleaved.length * 2, true);// 写入二进制数据const length = interleaved.length;let index = 44;for (let i = 0; i < length; i++) {view.setInt16(index, interleaved[i] * 32767, true);index += 2;}return new Blob([view], {type: 'audio/wav'});}interleave(input) {const length = input.reduce((acc, buffer) => acc + buffer.length, 0);const result = new Float32Array(length);const channels = input.length;for (let channel = 0; channel < channels; channel++) {const data = input[channel];for (let i = 0; i < data.length; i++) {result[channel + channels * i] = data[i];}}return result;}writeString(view, offset, string) {for (let i = 0; i < string.length; i++) {view.setUint8(offset + i, string.charCodeAt(i));}}}</script>
</body>
</html>

在此示例中,我们使用了 Recorder 类来处理录音。它使用 Web Audio API 和 JavaScript 中的数据类型来处理音频数据。getUserMedia() 方法用来获取麦克风流,AudioContext 用来处理音频,MediaStreamAudioSourceNode 用来将麦克风流转换为音频数据。我们还创建了一个音频元素并将其添加到页面,以便我们可以播放录制的音频。

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

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

相关文章

智慧校园:打造未来教育新时代

智慧校园&#xff1a;打造未来教育新时代 智慧校园是指利用先进的信息技术手段&#xff0c;通过云计算、大数据分析、人工智能等技术来提升教育教学质量和管理效率的一种模式。随着科技的不断发展&#xff0c;智慧校园正成为教育领域的热门话题。本文将深入探讨智慧校园的定义、…

leetCode 90.子集 II + 回溯算法 + 图解 + 笔记

给你一个整数数组 nums &#xff0c;其中可能包含重复元素&#xff0c;请你返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。返回的解集中&#xff0c;子集可以按 任意顺序 排列 示例 1&#xff1a; 输入&#xff1a;nums [1,2,2] 输出…

如何优雅的进行业务分层

1.什么是应用分层 说起应用分层&#xff0c;大部分人都会认为这个不是很简单嘛 就controller&#xff0c;service, mapper三层。 看起来简单&#xff0c;很多人其实并没有把他们职责划分开&#xff0c;在很多代码中&#xff0c;controller做的逻辑比service还多,service往往当…

Mysql的页结构详解

1.数据库的存储结构&#xff1a;页 索引结构为我们提供了搞笑的查找方式&#xff0c;索引信息和数据记录都在保存在文件上的&#xff0c;准确地说&#xff0c;是保存在“页”结构中。 1.1磁盘与内存的基本交互单位&#xff1a;页 InnoDB将数据划分为若干个页&#xff0c;Inn…

2023年中国消费金融行业研究报告

第一章 行业概况 1.1 定义 中国消费金融行业&#xff0c;作为国家金融体系的重要组成部分&#xff0c;旨在为消费者提供多样化的金融产品和服务&#xff0c;以满足其消费需求。这一行业包括银行、消费金融公司、小额贷款公司等多种金融机构&#xff0c;涵盖了包括消费贷款在内…

【详解】Spark数据倾斜问题由基础到深入详解-完美理解-费元星

数据倾斜定义&#xff1a;顾名思义&#xff0c;就是大量相似或相同数据聚集在一个块的节点里&#xff0c;导致计算和资源分配不均导致的计算缓慢&#xff08;长尾&#xff09;问题。 数据倾斜原因&#xff1a; count(distinct field) group by NULL 空值 Shuffle (概率最…

计算机二级考试题库(答案)

题目一&#xff1a;计算机网络基础 1.计算机网络的定义是什么? 计算机网络是指由通讯设备和不同类型计算机组成的计算机系统&#xff0c;利用传输介质&#xff0c;如电缆、光缆、无线等与通讯协议&#xff0c;实现计算机之间的信息传递和共享资源。 2. 内网和外网有什么区别?…

Vue2学习笔记(监视属性)

一、案例1 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>监视属性</title><script type…

【Datagear】关于Datagear目前发现的部分限制

【背景】 Datagear是一款非常不错的开源可商用BI分析平台&#xff0c;市面上大多数贩卖的BI平台能做的它基本都能做&#xff0c;不能做的也可以通过自己编辑JS甚至写后端服务实现&#xff0c;有完整的用户和权限管理系统内置&#xff0c;是很不错的低成本实现企业BI需求的平台…

html实现各种好看的鼠标滑过图片特效模板

文章目录 1.鼠标悬浮效果1.1 渐动效果1.2 渐变效果1.3 边框效果1.4 线行效果1.5 图标效果1.6 块状效果1.7 边线效果1.8 放大效果1.9 渐出效果1.10 痕迹效果1.11 交叉效果1.12 着重效果1.13 详展效果1.14 能动效果1.15 明细效果 2.主要源码2.1 源代码 源码下载 作者&#xff1a;…

Java-easyExcel入门教程

文章目录 前言一、简介二、使用步骤1. 引入依赖2. 前提准备3. 实现导出4. 实现导入 三、我所遇到的问题四、总结 前言 在日常开发中经常会遇到一些 excel 表导入导出的需求&#xff0c;以往会使用 POI 封装成工具类来处理这些导入导出的需求&#xff0c;但是 POI 在导入大文件…

Docker 环境中 Spring Boot 应用的 Arthas 故障排查与性能优化实战

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

【零基础入门Docker】Dockerfile中的USER指令以及dockerfile命令详解

✍面向读者&#xff1a;所有人 ✍所属专栏&#xff1a;Docker零基础入门专栏 目录 第 1 步&#xff1a;创建 Dockerfile 第 2 步&#xff1a;构建 Docker 镜像 第 3 步&#xff1a;运行 Docker 容器 第 4 步&#xff1a;验证输出 dockerfile命令详解 最佳实践 默认情况下…

matlab 基于卡尔曼滤波的GPS-INS的数据融合的导航

1、内容简介 略 25-可以交流、咨询、答疑 2、内容说明 基于卡尔曼滤波的GPS-INS的数据融合的导航 "基于卡尔曼滤波的GPS-INS的数据融合的导航 基于卡尔曼滤波实现GPS-INS组合导航系统" 卡尔曼滤波、GPS、INS、数据融合、导航 3、仿真分析 4、参考论文 略 …

[github全教程]github版本控制最全教学------- 大厂找工作面试必备!

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于新西兰奥克兰大学攻读IT硕士学位。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。跨领域…

如何精准操作无人机自动停机坪?

无人机自动停机坪通过自主导航和避障功能&#xff0c;实现了无人机的自主降落和起飞&#xff0c;在无人机技术领域起到了至关重要的作用。停机坪不仅仅是无人机的起降平台&#xff0c;还具备自动换电或充电等功能&#xff0c;为无人机的自动化提供了关键支持。为更有效地操作无…

ESP32-Web-Server编程-CSS 基础 2

ESP32-Web-Server编程-CSS 基础 2 概述 如上节所述&#xff0c;可以使用外部 CSS 文件来修饰指定的 HTML 文件。 外部引用 - 使用外部 CSS 文件。 当样式需要被应用到很多页面的时候&#xff0c;外部样式表将是理想的选择。使用外部样式表&#xff0c;就可以通过更改一个文件…

SQL Server 2016(基本概念和命令)

1、文件类型。 【1】主数据文件&#xff1a;数据库的启动信息。扩展名为".mdf"。 【2】次要&#xff08;辅助&#xff09;数据文件&#xff1a;主数据之外的数据都是次要数据文件。扩展名为".ndf"。 【3】事务日志文件&#xff1a;包含恢复数据库的所有事务…

python高级练习题库实验1(B)部分

文章目录 题目1代码实验结果题目2代码实验结果题目3代码实验结果题目4代码实验结果题目5代码实验结果题目总结题目1 打包糖果小游戏,用户输入糖果品牌与个数,还有一个盒子里面可以装多少个糖果,输出一些打印信息,如下图所示: 代码 print("Packaging lollies into…

CF1877 E. Autosynthesis 基环树dp

传送门:CF [前题提要]:一道基环树dp,但是题目有点绕,当时卡了我整整半天,到了第二天换了和清醒的脑子然后和别人讨论才整明白,故记录一下 题目很绕,故不再介绍. 首先对于这种下标和值有关系的题目.其实不难想到建图(CF上有大量这种 t r i c k trick trick),随便举个类似的题…