当前位置:首页 > JavaScript

js网页实现录音

2026-02-02 14:13:46JavaScript

使用Web Audio API和MediaRecorder实现录音

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

获取用户麦克风权限

js网页实现录音

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);
  // 可以播放或下载录音
};

控制录音过程

js网页实现录音

// 开始录音
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参数指定:

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 实现vue

js 实现vue

实现 Vue 的核心功能 在 JavaScript 中实现 Vue 的核心功能需要模拟数据绑定、虚拟 DOM 和响应式系统。以下是一个简化版的实现思路: 响应式系统 通过 Object.defin…

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 //…

用css制作淘宝网页

用css制作淘宝网页

淘宝网页的CSS制作要点 淘宝网页的布局和样式较为复杂,涉及响应式设计、商品展示、导航栏等。以下是一些关键CSS实现方法。 导航栏设计 导航栏通常固定在顶部,包含logo、搜索框和用户操作入口。使用…

css如何制作响应网页

css如何制作响应网页

响应式网页设计基础 使用CSS制作响应式网页的核心是通过媒体查询(Media Queries)和弹性布局(Flexbox/Grid)实现。媒体查询允许根据设备特性(如屏幕宽度)应用不同的样式规则。…

vue实现网页上下滑动

vue实现网页上下滑动

Vue实现网页上下滑动的方法 使用CSS实现基础滚动 通过CSS的overflow-y属性控制容器滚动,适用于静态内容滚动: .scroll-container { height: 100vh…

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https:/…