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

js实现音频的录制

<!DOCTYPE html>
<html lang="zh"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>录音</title>
</head><body><h1>录音</h1><div><button onclick="getDeviceList()">获取设备列表</button><button onclick="checkSupportType()">检查支持的类型</button><button id="start">开始录音</button><button id="pause">暂停录音</button><button id="resume">继续录音</button><button id="stop">停止录音</button><button id="play">播放录音</button><button id="download">下载录音</button></div><script>const start = document.getElementById("start");const pause = document.getElementById("pause");const resume = document.getElementById("resume");const stop = document.getElementById("stop");const play = document.getElementById("play");const download = document.getElementById("download");const audioType = 'audio/webm';//audio/ogg和audio/webm两种格式通用// 录音相关变量let mediaRecorder;let chunks = []init();//初始化 function init() {//禁用按钮setDisabled(start, startHandler);setDisabled(pause, pauseHandler);setDisabled(resume, resumeHandler);setDisabled(stop, stopHandler);setDisabled(play, playHandler);setDisabled(download, downloadHandler);// 检查浏览器兼容性if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {alert("您的浏览器不支持录音功能,请更换浏览器后重试!");return;}setEnabled(start, startHandler);}/*** 获取设备列表*/function getDeviceList() {if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {console.log("enumerateDevices() not supported.");} else {navigator.mediaDevices.enumerateDevices().then((devices) => {devices.forEach((device) => {//console.log(device);//device.kind: videoinput audioinput audiooutputconsole.log(`${device.kind}: ${device.label} id = ${device.deviceId}`);});}).catch((err) => {console.log(`${err.name}: ${err.message}`);});}}/*** 元素禁用*/function setDisabled(element, removeFunction) {element.disabled = true;if (removeFunction) {element.removeEventListener("click", removeFunction);}}/*** 元素启用*/function setEnabled(element, addFunction) {console.log('setEnabled');console.log(element);element.disabled = false;if (addFunction) {element.addEventListener("click", addFunction);}}function checkSupportType() {const types = ["video/webm","audio/webm","video/webm;codecs=vp8","video/webm;codecs=daala","video/webm;codecs=h264","audio/webm;codecs=opus","video/mp4",];for (const type of types) {let res = MediaRecorder.isTypeSupported(type)//true不一定表示一定可以使用console.log(`${type}是否支持:${res}`);}}/*** 开始录音*/function startHandler() {//开始录音const constraints = { audio: true }//const constraints = { audio: true, video: true }//https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedianavigator.mediaDevices.getUserMedia(constraints).then((stream) => {//mimeType支持webm和ogg,ogg不需要设置options的mineTypelet options = {};if (audioType == "audio/webm") {options = { mimeType: 'audio/webm; codecs=opus' };}mediaRecorder = new MediaRecorder(stream, options);//设置的mimeType类型console.log(mediaRecorder.mimeType);//状态inactive recording pausedconsole.log(mediaRecorder.state);//navigator.mediaDevices.getUserMedia的stream 对象console.log(stream);//视频采用的编码比率console.log(mediaRecorder.videoBitsPerSecond);//音频采用的编码比率console.log(mediaRecorder.audioBitsPerSecond);if (mediaRecorder.state != "inactive") {alert('麦克风正在使用中,请先关闭再试!');return;}mediaRecorder.ondataavailable = (e) => {console.log('接收到收据');chunks.push(e.data)}chunks = [];mediaRecorder.start();console.log('开始录音');setDisabled(start, startHandler);setEnabled(pause, pauseHandler);setEnabled(stop, stopHandler);setDisabled(resume, resumeHandler);setDisabled(play, playHandler);setDisabled(download, downloadHandler);}).catch((err) => {console.log(err.name);switch (err.name) {case "AbortError":alert("设备无法使用");break;case "NotAllowedError":alert("您拒绝了访问您的设备!");break;case "NotFoundError":alert("未找到设备");break;case "NotReadableError":alert("设备不可读");break;case "OverconstrainedError":alert("无法满足要求");break;case "SecurityError":alert("安全错误");break;case "TypeError":alert("类型错误");break;case "NotSupportedError":alert("浏览器不支持");break;}})}/*** 暂停录音*/function pauseHandler() {if (!mediaRecorder || mediaRecorder.state != "recording") {alert('未开始录音');return;}mediaRecorder.pause();console.log('暂停录音');setDisabled(start, startHandler);setDisabled(pause, pauseHandler);setDisabled(stop, stopHandler);setEnabled(resume, resumeHandler);setDisabled(play, playHandler);setDisabled(download, downloadHandler);}/*** 继续录音*/function resumeHandler() {if (!mediaRecorder || mediaRecorder.state != "paused") {alert('未暂停录音');return;}mediaRecorder.resume();console.log('继续录音');setDisabled(start, startHandler);setEnabled(pause, pauseHandler);setEnabled(stop, stopHandler);setDisabled(resume, resumeHandler);setDisabled(play, playHandler);setDisabled(download, downloadHandler);}/*** 停止录音*/function stopHandler() {if (!mediaRecorder || mediaRecorder.state != "recording") {alert('未开始录音');return;}mediaRecorder.stop();console.log('停止录音');setEnabled(start, startHandler);setDisabled(pause, pauseHandler);setDisabled(stop, stopHandler);setDisabled(resume, resumeHandler);setEnabled(play, playHandler);setEnabled(download, downloadHandler);}/*** 播放录音*/function playHandler() {if (!chunks || chunks.length <= 0) {alert('未有录音信息');return;}console.log('播放录音');// 创建音频文件const audioBlob = new Blob(chunks, { type: audioType });var audio = new Audio();audio.src = URL.createObjectURL(audioBlob);// 监听音频播放完毕的事件audio.addEventListener('ended', function () {// 销毁<audio>元素console.log('音频播放完毕,销毁<audio>元素');audio = null;});audio.play();}/*** 下载录音*/function downloadHandler() {if (!chunks || chunks.length <= 0) {alert('未有录音信息');return;}console.log('下载录音');// 创建音频文件const audioBlob = new Blob(chunks, { type: audioType });const a = document.createElement('a');a.href = URL.createObjectURL(audioBlob);let audioExt = 'webm';if (audioType == 'audio/webm') {audioExt = 'webm';}if (audioType == 'audio/ogg') {audioExt = 'ogg';}a.download = `recording_${new Date().toISOString().replace(/[:.]/g, '-')}.${audioExt}`;document.body.appendChild(a);a.click();document.body.removeChild(a);}</script>
</body></html>

支持点击录制、暂停、继续录制、停止录制、播放、下载的功能,可以下载试试效果~~

在这里插入图片描述

参考

https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia
https://developer.mozilla.org/zh-CN/docs/Web/API/MediaStream
https://developer.mozilla.org/zh-CN/docs/Web/API/MediaRecorder
https://gitee.com/qxscj/js-demo/blob/master/html+css/38-1.html

相关文章:

  • LangGraph-agent-天气助手
  • 地下综合管廊 3D 可视化平台
  • 微信小程序数据接收
  • uniapp-商城-67-shop(3-品牌信息显示,弹窗显示完整品牌信息,弹窗拨打电话、地图定位)
  • 安卓11 不带谷歌包默认桌面布局
  • HarmonyOS赋能套件介绍
  • 聊一聊手动测试与探索性测试的区别
  • mysql统计数据库大小
  • 从Embedding到多模态检索:AI知识库构建的进阶路线图
  • 2021-10-28 C++判断完全平方数
  • 学习STC51单片机14(芯片为STC89C52RC)
  • 点云补全技术深度解析:从原理到实践
  • JWT生成的token的构成部分
  • 5.Java 面向对象编程入门:类与对象的创建和使用​
  • 【C++】深入理解C++中的函数与运算符重载
  • Android中获取控件尺寸进阶方案
  • vocabulary in code
  • SMT贴片机操作核心步骤精要
  • Selenium自动化测试网页加载太慢如何解决?
  • 《企业级日志该怎么打?Java日志规范、分层设计与埋点实践》
  • 一个网站备案多个域名吗/长沙seo管理
  • 去哪里做网站比较好/高端网站建设的公司
  • 网站建设自学/竞价账户托管哪家好
  • 重庆网站建设找重庆万为/软件开发培训
  • 武汉网站建站/立即优化在哪里
  • 有没有做图的网站/排名软件