当前位置:首页 > 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();
    // 处理录音结果
  });
}

音频格式处理

将录音转换为不同格式:

  • 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' });

处理兼容性问题

检测浏览器支持情况:

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绘制波形
}

添加录音时长限制:

js实现录音功能

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

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

相关文章

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js图片上传实现

js图片上传实现

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API实现基础图片上传功能。HTML部分需要设置accept="image/…

js计算器的实现

js计算器的实现

实现基础结构 HTML部分需要创建计算器的基本框架,包含显示区域和按钮。使用<div>容器包裹整个计算器,内部设置一个显示屏和多个按钮。 <div class="calculato…

js 实现图片 放大

js 实现图片 放大

使用 CSS transform 实现图片放大 通过 CSS 的 transform: scale() 属性可以实现图片的平滑放大效果。结合 JavaScript 监听鼠标事件控制放大状态: con…

js 实现日历

js 实现日历

实现日历的基本思路 日历的核心功能是展示日期,并允许用户进行日期选择或导航。JavaScript 可以动态生成日历的 HTML 结构,并处理用户交互逻辑。 基础日历结构 日历通常包含头部(显示月份和…