当前位置:首页 > JavaScript

js 实现录音

2026-04-06 20:25:59JavaScript

录音功能实现基础

在JavaScript中实现录音功能通常需要借助浏览器提供的Web Audio API和MediaDevices API。现代浏览器支持通过navigator.mediaDevices.getUserMedia获取麦克风权限,结合AudioContext处理音频流。

获取麦克风权限

调用getUserMedia方法请求麦克风访问权限。该方法返回一个Promise,成功时解析为MediaStream对象:

navigator.mediaDevices.getUserMedia({ audio: true })
  .then(stream => {
    // 处理音频流
  })
  .catch(err => {
    console.error('麦克风访问被拒绝:', err);
  });

创建录音控制器

使用MediaRecorderAPI录制音频流。需先检查浏览器兼容性:

if (MediaRecorder.isTypeSupported('audio/webm')) {
  const recorder = new MediaRecorder(stream, {
    mimeType: 'audio/webm'
  });

  recorder.ondataavailable = (e) => {
    const audioBlob = e.data;
    // 处理录制的音频数据
  };
}

控制录音过程

实现开始/停止录音的基本控制逻辑:

let chunks = [];

recorder.onstart = () => {
  chunks = [];
};

recorder.ondataavailable = (e) => {
  chunks.push(e.data);
};

function startRecording() {
  recorder.start(1000); // 每1秒收集一次数据
}

function stopRecording() {
  recorder.stop();
  const blob = new Blob(chunks, { type: 'audio/webm' });
  const audioURL = URL.createObjectURL(blob);
  // 可创建<audio>元素播放或上传服务器
}

音频可视化处理

通过AnalyserNode实现实时音频波形可视化:

const audioContext = new AudioContext();
const source = audioContext.createMediaStreamSource(stream);
const analyser = audioContext.createAnalyser();

source.connect(analyser);
analyser.fftSize = 256;
const bufferLength = analyser.frequencyBinCount;
const dataArray = new Uint8Array(bufferLength);

function drawWaveform() {
  requestAnimationFrame(drawWaveform);
  analyser.getByteTimeDomainData(dataArray);
  // 使用canvas绘制波形
}

兼容性处理

对于不支持MediaRecorder的浏览器,可使用第三方库如:

js 实现录音

  • RecordRTC
  • wavesurfer.js
  • libvorbis.js

完整示例代码

const startBtn = document.getElementById('start');
const stopBtn = document.getElementById('stop');
const audioPlayer = document.getElementById('player');

let recorder, stream;

startBtn.onclick = async () => {
  stream = await navigator.mediaDevices.getUserMedia({ audio: true });
  recorder = new MediaRecorder(stream);

  const chunks = [];
  recorder.ondataavailable = e => chunks.push(e.data);
  recorder.onstop = () => {
    const blob = new Blob(chunks, { type: 'audio/ogg' });
    audioPlayer.src = URL.createObjectURL(blob);
  };

  recorder.start();
};

stopBtn.onclick = () => {
  recorder.stop();
  stream.getTracks().forEach(track => track.stop());
};

注意事项

  • 需在HTTPS环境或localhost下运行
  • 首次使用需处理用户权限请求
  • 不同浏览器支持的音频格式可能不同
  • 移动端设备可能有额外的限制

扩展功能

  • 添加音频效果处理(如降噪)
  • 实现多轨录音
  • 支持音频格式转换
  • 添加录音时长限制
  • 实现语音识别集成

标签: js
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时功能可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterva…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…