当前位置:首页 > 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 = [];

js实现录音

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 { // 正常录音逻辑 }

js实现录音

音频格式选择

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实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <di…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

js 实现拖拽

js 实现拖拽

实现拖拽的基本步骤 在JavaScript中实现拖拽功能需要监听几个关键事件:mousedown、mousemove和mouseup。以下是实现的基本逻辑。 监听目标元素的mousedown事件,记…

js实现文件夹

js实现文件夹

使用JavaScript创建文件夹 在浏览器端的JavaScript中无法直接操作文件系统创建文件夹,这是出于安全考虑。但在Node.js环境中可以通过文件系统模块(fs)实现。 Node.js中使…