当前位置:首页 > JavaScript

js实现录音

2026-01-31 14:47:28JavaScript

使用Web Audio API实现录音

Web Audio API提供了一套完整的音频处理系统,可以用于录音功能。以下是实现录音的基本步骤:

navigator.mediaDevices.getUserMedia({ audio: true }) .then(function(stream) { const audioContext = new AudioContext(); const mediaStreamSource = audioContext.createMediaStreamSource(stream); const scriptProcessor = audioContext.createScriptProcessor(4096, 1, 1);

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

mediaStreamSource.connect(scriptProcessor);
scriptProcessor.connect(audioContext.destination);

}) .catch(function(err) { console.error('获取麦克风权限失败:', err); });

使用MediaRecorder API实现录音

MediaRecorder API是更简单直接的录音解决方案,支持将录音保存为多种格式:

const startRecording = () => { navigator.mediaDevices.getUserMedia({ audio: true }) .then(stream => { const mediaRecorder = new MediaRecorder(stream); let audioChunks = [];

    mediaRecorder.ondataavailable = e => {
        audioChunks.push(e.data);
    };

    mediaRecorder.onstop = () => {
        const audioBlob = new Blob(audioChunks, { type: 'audio/wav' });
        const audioUrl = URL.createObjectURL(audioBlob);
        // 使用audioUrl播放或下载录音
    };

    mediaRecorder.start();
});

};

处理录音数据

录音完成后,可以将数据转换为可用的格式:

const saveRecording = (audioChunks) => { const audioBlob = new Blob(audioChunks, { type: 'audio/wav' }); const audioUrl = URL.createObjectURL(audioBlob);

// 创建下载链接
const a = document.createElement('a');
a.href = audioUrl;
a.download = 'recording.wav';
a.click();

// 或者创建音频元素播放
const audio = new Audio(audioUrl);
audio.play();

};

添加录音控制功能

完整的录音功能通常需要开始、暂停和停止控制:

let mediaRecorder; let audioChunks = [];

const startBtn = document.getElementById('start'); const stopBtn = document.getElementById('stop');

startBtn.addEventListener('click', () => { navigator.mediaDevices.getUserMedia({ audio: true }) .then(stream => { mediaRecorder = new MediaRecorder(stream); mediaRecorder.start();

    mediaRecorder.ondataavailable = e => {
        audioChunks.push(e.data);
    };
});

});

stopBtn.addEventListener('click', () => { mediaRecorder.stop(); // 录音停止后会触发onstop事件 });

处理浏览器兼容性

不同浏览器对录音API的支持程度不同,需要做兼容性处理:

if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) { alert('您的浏览器不支持录音功能'); } else if (!MediaRecorder) { alert('您的浏览器不支持MediaRecorder API'); } else { // 正常录音逻辑 }

音频格式选择

MediaRecorder支持多种音频格式,可以通过mimeType参数指定:

const options = { mimeType: 'audio/webm', // 也可以是'audio/wav'、'audio/mp3'等 audioBitsPerSecond: 128000 // 比特率 };

const mediaRecorder = new MediaRecorder(stream, options);

录音可视化

可以使用Canvas实现录音波形可视化:

const canvas = document.getElementById('visualizer'); const canvasCtx = canvas.getContext('2d');

const drawWaveform = (audioData) => { canvasCtx.clearRect(0, 0, canvas.width, canvas.height); canvasCtx.fillStyle = 'rgb(200, 200, 200)'; canvasCtx.fillRect(0, 0, canvas.width, canvas.height);

canvasCtx.lineWidth = 2;
canvasCtx.strokeStyle = 'rgb(0, 0, 0)';
canvasCtx.beginPath();

const sliceWidth = canvas.width / audioData.length;
let x = 0;

for(let i = 0; i < audioData.length; i++) {
    const v = audioData[i] / 128.0;
    const y = v * canvas.height/2;

    if(i === 0) {
        canvasCtx.moveTo(x, y);
    } else {
        canvasCtx.lineTo(x, y);
    }

    x += sliceWidth;
}

canvasCtx.lineTo(canvas.width, canvas.height/2);
canvasCtx.stroke();

};

js实现录音

标签: js
分享给朋友:

相关文章

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以…

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js实现继承

js实现继承

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

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…