当前位置:首页 > JavaScript

js实现录音功能

2026-02-03 02:14:31JavaScript

使用Web Audio API实现录音

通过navigator.mediaDevices.getUserMedia获取麦克风权限,结合MediaRecorderAPI实现录音:

let mediaRecorder;
let audioChunks = [];

async function startRecording() {
  const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
  mediaRecorder = new MediaRecorder(stream);

  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 = [];
}

function stopRecording() {
  mediaRecorder.stop();
  mediaRecorder.stream.getTracks().forEach(track => track.stop());
}

使用第三方库RecordRPC

对于更复杂的需求,可以使用RecordRPC库简化实现:

import RecordRPC from 'recordrtc';

let recorder;
navigator.mediaDevices.getUserMedia({ audio: true }).then(stream => {
  recorder = new RecordRPC(stream, { type: 'audio' });
  recorder.startRecording();
});

function stopRecording() {
  recorder.stopRecording(() => {
    const blob = recorder.getBlob();
    // 处理录音结果
  });
}

音频格式处理

将录音转换为不同格式:

js实现录音功能

  • WAV格式适合高保真录音
  • MP3格式适合减小文件体积
  • OGG格式适合网页播放

使用audiobuffer-to-wav库转换:

import audioBufferToWav from 'audiobuffer-to-wav';

// 从Blob获取AudioBuffer
const audioContext = new AudioContext();
const arrayBuffer = await blob.arrayBuffer();
const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);

// 转换为WAV
const wav = audioBufferToWav(audioBuffer);
const wavBlob = new Blob([wav], { type: 'audio/wav' });

处理兼容性问题

检测浏览器支持情况:

js实现录音功能

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

处理不同浏览器的MIME类型限制:

const mimeType = MediaRecorder.isTypeSupported('audio/webm') 
  ? 'audio/webm' 
  : 'audio/ogg';

录音功能优化

添加可视化效果:

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

function drawWaveform() {
  requestAnimationFrame(drawWaveform);
  const dataArray = new Uint8Array(analyser.frequencyBinCount);
  analyser.getByteTimeDomainData(dataArray);
  // 使用canvas绘制波形
}

添加录音时长限制:

const MAX_DURATION = 300000; // 5分钟
setTimeout(() => {
  stopRecording();
}, MAX_DURATION);

标签: 录音功能js
分享给朋友:

相关文章

js实现轮播

js实现轮播

实现基础轮播效果 使用HTML结构创建轮播容器和图片元素: <div class="carousel"> <div class="carousel-inner">…

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现继承

js实现继承

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

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Ja…