当前位置:首页 > JavaScript

js网页实现录音

2026-02-02 14:13:46JavaScript

使用Web Audio API和MediaRecorder实现录音

在网页中实现录音功能可以通过Web Audio API和MediaRecorder API完成。以下是一个完整的实现方案:

获取用户麦克风权限

navigator.mediaDevices.getUserMedia({ audio: true })
  .then(stream => {
    // 成功获取音频流
  })
  .catch(err => {
    console.error('无法访问麦克风:', err);
  });

创建录音器实例

const mediaRecorder = new MediaRecorder(stream);
let audioChunks = [];

mediaRecorder.ondataavailable = event => {
  audioChunks.push(event.data);
};

mediaRecorder.onstop = () => {
  const audioBlob = new Blob(audioChunks, { type: 'audio/wav' });
  const audioUrl = URL.createObjectURL(audioBlob);
  // 可以播放或下载录音
};

控制录音过程

// 开始录音
mediaRecorder.start();
audioChunks = []; // 每次开始前清空之前的录音片段

// 停止录音
mediaRecorder.stop();

音频可视化处理

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

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

source.connect(analyser);
analyser.connect(audioContext.destination);

// 获取音频数据用于可视化
const bufferLength = analyser.frequencyBinCount;
const dataArray = new Uint8Array(bufferLength);
analyser.getByteTimeDomainData(dataArray);

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

录音格式设置

MediaRecorder支持多种音频格式,可通过mimeType参数指定:

js网页实现录音

const options = {
  mimeType: 'audio/webm', // 或 'audio/wav', 'audio/mp3'等
  audioBitsPerSecond: 128000 // 比特率
};
const recorder = new MediaRecorder(stream, options);

完整示例代码

<button id="start">开始录音</button>
<button id="stop">停止录音</button>
<audio id="playback" controls></audio>
<canvas id="visualizer" width="300" height="100"></canvas>

<script>
  let mediaRecorder, audioChunks = [];

  document.getElementById('start').onclick = async () => {
    const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
    mediaRecorder = new MediaRecorder(stream);

    mediaRecorder.ondataavailable = e => audioChunks.push(e.data);
    mediaRecorder.onstop = () => {
      const audioBlob = new Blob(audioChunks, { type: 'audio/wav' });
      document.getElementById('playback').src = URL.createObjectURL(audioBlob);
    };

    mediaRecorder.start();
    setupVisualizer(stream);
  };

  document.getElementById('stop').onclick = () => {
    mediaRecorder.stop();
    mediaRecorder.stream.getTracks().forEach(track => track.stop());
  };

  function setupVisualizer(stream) {
    const audioContext = new AudioContext();
    const analyser = audioContext.createAnalyser();
    audioContext.createMediaStreamSource(stream).connect(analyser);

    const canvas = document.getElementById('visualizer');
    const ctx = canvas.getContext('2d');

    function draw() {
      requestAnimationFrame(draw);
      const bufferLength = analyser.frequencyBinCount;
      const dataArray = new Uint8Array(bufferLength);
      analyser.getByteTimeDomainData(dataArray);

      ctx.fillStyle = 'rgb(200, 200, 200)';
      ctx.fillRect(0, 0, canvas.width, canvas.height);
      ctx.lineWidth = 2;
      ctx.strokeStyle = 'rgb(0, 0, 0)';
      ctx.beginPath();

      const sliceWidth = canvas.width / bufferLength;
      let x = 0;

      for(let i = 0; i < bufferLength; i++) {
        const v = dataArray[i] / 128.0;
        const y = v * canvas.height/2;

        if(i === 0) ctx.moveTo(x, y);
        else ctx.lineTo(x, y);

        x += sliceWidth;
      }

      ctx.lineTo(canvas.width, canvas.height/2);
      ctx.stroke();
    }

    draw();
  }
</script>

注意事项

  • 现代浏览器要求页面必须通过HTTPS协议加载才能使用getUserMedia API
  • 某些浏览器可能不支持特定音频格式,建议测试目标浏览器兼容性
  • 录音前必须获得用户明确授权,否则会抛出SecurityError
  • 长时间录音可能消耗大量内存,建议分段处理大录音文件

标签: 网页js
分享给朋友:

相关文章

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现拷贝

js实现拷贝

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

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现显示隐藏

js实现显示隐藏

显示隐藏的实现方法 在JavaScript中,实现元素的显示和隐藏可以通过多种方式完成。以下是几种常见的方法: 修改CSS的display属性 通过改变元素的display属性可以在none(隐藏)…