当前位置:首页 > 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'; } Par…

h5实现网页跳转

h5实现网页跳转

H5实现网页跳转的方法 在HTML5中,可以通过多种方式实现网页跳转。以下是几种常见的方法: 使用<a>标签 通过超链接标签实现跳转是最传统的方式: <a href="http…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js实现防洪

js实现防洪

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

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…