当前位置:首页 > JavaScript

js网页实现录音

2026-04-07 07:48:54JavaScript

使用 Web Audio API 和 MediaRecorder

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

// 获取用户麦克风权限
navigator.mediaDevices.getUserMedia({ audio: true })
  .then(function(stream) {
    // 创建音频上下文
    const audioContext = new AudioContext();
    const mediaStreamSource = audioContext.createMediaStreamSource(stream);

    // 创建MediaRecorder实例
    const mediaRecorder = new MediaRecorder(stream);
    let audioChunks = [];

    // 开始录制
    document.getElementById('startBtn').addEventListener('click', () => {
      audioChunks = [];
      mediaRecorder.start();
    });

    // 停止录制
    document.getElementById('stopBtn').addEventListener('click', () => {
      mediaRecorder.stop();
    });

    // 收集音频数据
    mediaRecorder.ondataavailable = function(e) {
      audioChunks.push(e.data);
    };

    // 录制完成处理
    mediaRecorder.onstop = function() {
      const audioBlob = new Blob(audioChunks, { type: 'audio/wav' });
      const audioUrl = URL.createObjectURL(audioBlob);
      const audio = new Audio(audioUrl);

      // 播放录音
      document.getElementById('playBtn').addEventListener('click', () => {
        audio.play();
      });

      // 下载录音
      document.getElementById('downloadBtn').addEventListener('click', () => {
        const a = document.createElement('a');
        a.href = audioUrl;
        a.download = 'recording.wav';
        a.click();
      });
    };
  })
  .catch(function(err) {
    console.error('获取麦克风权限失败:', err);
  });

添加HTML界面

<button id="startBtn">开始录音</button>
<button id="stopBtn">停止录音</button>
<button id="playBtn">播放录音</button>
<button id="downloadBtn">下载录音</button>

处理兼容性问题

不同浏览器对音频格式的支持可能不同。可以通过检查MediaRecorder的isTypeSupported方法来确保兼容性:

if (MediaRecorder.isTypeSupported('audio/webm')) {
  options = { mimeType: 'audio/webm' };
} else if (MediaRecorder.isTypeSupported('audio/ogg')) {
  options = { mimeType: 'audio/ogg; codecs=opus' };
} else {
  options = { mimeType: 'audio/wav' };
}

const mediaRecorder = new MediaRecorder(stream, options);

错误处理

添加适当的错误处理可以提高用户体验:

navigator.mediaDevices.getUserMedia({ audio: true })
  .catch(err => {
    alert('无法访问麦克风,请检查权限设置');
    console.error('麦克风访问错误:', err);
  });

音频可视化

可以使用AnalyserNode实现录音时的音频可视化效果:

js网页实现录音

const analyser = audioContext.createAnalyser();
mediaStreamSource.connect(analyser);

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

  // 使用canvas绘制波形
  const canvas = document.getElementById('waveform');
  const ctx = canvas.getContext('2d');
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.beginPath();

  for(let i = 0; i < bufferLength; i++) {
    const x = i * canvas.width / bufferLength;
    const y = dataArray[i] / 255 * canvas.height;
    if(i === 0) {
      ctx.moveTo(x, y);
    } else {
      ctx.lineTo(x, y);
    }
  }

  ctx.stroke();
  requestAnimationFrame(drawWaveform);
}

drawWaveform();

注意事项

  • 现代浏览器要求网页通过HTTPS协议或在localhost环境下才能访问麦克风
  • 首次使用时浏览器会请求麦克风权限
  • 录音功能在移动设备上可能有不同的行为
  • 长时间录音需要考虑内存使用问题

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

相关文章

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

节流js实现

节流js实现

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

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…