我如何在javascript中从麦克风采样音频,用于麦克风动画?

cx6n0qe3  于 2022-12-10  发布在  Java
关注(0)|答案(1)|浏览(378)

我正在使用MediaStream Recording API在浏览器中录制麦克风的音频。我想为用户提供脉动麦克风图标的视觉反馈。类似于此,仅与麦克风的实际声音振幅相关。https://codepen.io/megwayne/pen/bWOYEj我该如何操作?
我正在录制这样的音频:

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

    mediaRecorder.addEventListener("dataavailable", event => {
      audioChunks.push(event.data);
    });
rt4zxlrg

rt4zxlrg1#

要在JavaScript中从麦克风采样音频,可以使用Web音频API。此API允许您使用JavaScript在Web浏览器中创建和处理音频。以下是如何使用Web音频API从麦克风采样音频的示例:

// Create a new audio context
const audioContext = new AudioContext();

// Create an audio input
const mic = audioContext.createMediaStreamSource(audioStream);

// Connect the audio input to a filter node
const filter = audioContext.createBiquadFilter();
mic.connect(filter);

// Connect the filter node to the destination (i.e. the speakers)
filter.connect(audioContext.destination);

此代码创建一个新的音频上下文,它是在Web音频API中管理音频的对象。然后,它创建一个来自麦克风的音频输入,并将其连接到一个筛选器节点。最后,它将筛选器节点连接到目标,在本例中是扬声器。
若要使麦克风具有动画效果,可以使用音频输入来创建正在采样的音频的视觉表示。可以使用来自音频输入的数据来实时更新动画。
要在JavaScript中创建采样音频的可视化表示,您可以使用Web音频API来分析音频数据。此API提供了许多可用于访问音频数据的方法和属性,包括AnalyserNode对象。此对象允许您对音频数据执行频域分析,然后您可以使用该分析来创建音频的可视化表示。
以下示例说明如何使用AnalyserNode对象在JavaScript中创建采样音频的可视表示形式:

// Create a new audio context
const audioContext = new AudioContext();

// Create an audio input
const mic = audioContext.createMediaStreamSource(audioStream);

// Create an analyser node
const analyser = audioContext.createAnalyser();

// Connect the audio input to the analyser node
mic.connect(analyser);

// Create a frequency data array
const frequencyData = new Uint8Array(analyser.frequencyBinCount);

// Update the frequency data array with the current audio data
analyser.getByteFrequencyData(frequencyData);

// Use the frequency data to create a visual representation of the audio
const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');

// Clear the canvas
ctx.clearRect(0, 0, canvas.width, canvas.height);

// Loop through the frequency data and draw a bar for each value
for (let i = 0; i < frequencyData.length; i++) {
  // Calculate the bar height
  const barHeight = frequencyData[i] / 256 * canvas.height;

  // Draw the bar
  ctx.fillRect(i * 2, canvas.height - barHeight, 2, barHeight);
}

这段代码创建了一个AnalyserNode对象,并使用它来分析麦克风的音频数据。然后,它创建了一个频率数据数组,并使用getByteFrequencyData方法用当前音频数据更新它。最后,它使用这些数据在画布元素上绘制一个条形图,其中每个条形的高度对应于该时间点的音频频率。
您可以使用此方法为采样音频创建各种不同的可视化效果。您还可以通过调用getByteFrequencyData方法并在循环中重绘可视化效果来实时更新可视化效果。

相关问题