当前位置:首页 > JavaScript

js实现录音

2026-03-02 05:55:23JavaScript

使用Web Audio API实现录音

Web Audio API提供了一套完整的音频处理系统,可以通过JavaScript在浏览器中实现录音功能。以下是一个基本的实现方法:

js实现录音

// 获取音频上下文
const audioContext = new (window.AudioContext || window.webkitAudioContext)();

// 请求麦克风权限
navigator.mediaDevices.getUserMedia({ audio: true })
  .then(function(stream) {
    // 创建音频源节点
    const source = audioContext.createMediaStreamSource(stream);

    // 创建录音处理器
    const recorder = audioContext.createScriptProcessor(4096, 1, 1);

    let audioChunks = [];
    recorder.onaudioprocess = function(e) {
      audioChunks.push(e.inputBuffer.getChannelData(0));
    };

    // 连接节点
    source.connect(recorder);
    recorder.connect(audioContext.destination);

    // 开始录音
    function startRecording() {
      audioChunks = [];
    }

    // 停止录音
    function stopRecording() {
      const audioBuffer = audioContext.createBuffer(1, 
        audioChunks.length * 4096, 
        audioContext.sampleRate);

      const channelData = audioBuffer.getChannelData(0);
      for (let i = 0; i < audioChunks.length; i++) {
        channelData.set(audioChunks[i], i * 4096);
      }

      return audioBuffer;
    }
  })
  .catch(function(err) {
    console.error('无法获取麦克风:', err);
  });

使用MediaRecorder API实现录音

MediaRecorder API是更简单的录音方案,可以直接录制媒体流:

js实现录音

let mediaRecorder;
let audioChunks = [];

navigator.mediaDevices.getUserMedia({ audio: true })
  .then(function(stream) {
    mediaRecorder = new MediaRecorder(stream);

    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);
      audio.play();
    };

    // 开始录音
    document.getElementById('start').onclick = function() {
      audioChunks = [];
      mediaRecorder.start();
    };

    // 停止录音
    document.getElementById('stop').onclick = function() {
      mediaRecorder.stop();
    };
  });

录音格式处理

录制完成后通常需要将音频数据转换为可用格式:

// 将Blob转换为Base64
function blobToBase64(blob) {
  return new Promise((resolve) => {
    const reader = new FileReader();
    reader.onload = () => resolve(reader.result);
    reader.readAsDataURL(blob);
  });
}

// 下载录音文件
function downloadAudio(audioBlob, filename = 'recording.wav') {
  const url = URL.createObjectURL(audioBlob);
  const a = document.createElement('a');
  a.href = url;
  a.download = filename;
  a.click();
}

注意事项

浏览器兼容性需要考虑,不同浏览器对音频API的支持程度不同。建议在使用前检测API可用性:

if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
  alert('您的浏览器不支持录音功能');
}

if (!window.MediaRecorder) {
  alert('您的浏览器不支持MediaRecorder API');
}

录音功能需要HTTPS环境或在localhost开发环境下才能正常工作,这是浏览器安全策略的要求。

标签: js
分享给朋友:

相关文章

js 实现vue

js 实现vue

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

js实现跳转

js实现跳转

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

js手势实现

js手势实现

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

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: func…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现文字滚动

js实现文字滚动

实现文字滚动的几种方法 使用CSS动画实现滚动 通过CSS的@keyframes和transform属性可以实现平滑的文字滚动效果。 <style> .scroll-text { w…