当前位置:首页 > 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实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:CSS…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现视口

js实现视口

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