网络音频 API -- 从分析器捕获流
Web Audio API -- Capture Stream from Analyser
Web 音频 API 示例显示源流直接进入音频上下文目标节点,如扬声器或 canvas。我想从分析器收集数据,然后用它渲染一个 React 组件。我想出的最好办法是间隔轮询:
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
mediaRecorder = new MediaRecorder(stream);
// start button click
mediaRecorder.start();
analyserPoll = setInterval(() => {
analyser.getFloatTimeDomainData(buffer);
collect = [...collect, buffer];
}, 500);
// stop button click
mediaRecorder.stop();
clearInterval(analyserPoll);
在没有 setTimeout 的 API 中是否有更正式的方法来执行此操作?例如,保存到 Blob 或文件,然后 运行 我的分析器代码?这是麦克劳德音高检测器。
不需要 AudioWorklets。所需要的是正确设计状态和效果。创建一个有效的操作,为您不想呈现的内容设置状态,例如缓冲区:
useEffect(() => {
// getFloatTimeDomainData
// setBufferState
}, //run effect when these deps change, buffer);
然后,在音频 api 收集结束后,例如当用户点击“停止按钮”时,将缓冲区设置为您要呈现的数据。
setData(buffer)
当您不理会缓冲区时,效果将不会呈现。对于昂贵的组件和收集数据很有帮助。
有大量的边缘案例。用户需要手势才能使用音频 api。 Audio Worklets 是流,所以没有真正的方法来持久化数据。在端口上发送消息的结果相同,但更复杂。
Web 音频 API 示例显示源流直接进入音频上下文目标节点,如扬声器或 canvas。我想从分析器收集数据,然后用它渲染一个 React 组件。我想出的最好办法是间隔轮询:
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
mediaRecorder = new MediaRecorder(stream);
// start button click
mediaRecorder.start();
analyserPoll = setInterval(() => {
analyser.getFloatTimeDomainData(buffer);
collect = [...collect, buffer];
}, 500);
// stop button click
mediaRecorder.stop();
clearInterval(analyserPoll);
在没有 setTimeout 的 API 中是否有更正式的方法来执行此操作?例如,保存到 Blob 或文件,然后 运行 我的分析器代码?这是麦克劳德音高检测器。
不需要 AudioWorklets。所需要的是正确设计状态和效果。创建一个有效的操作,为您不想呈现的内容设置状态,例如缓冲区:
useEffect(() => {
// getFloatTimeDomainData
// setBufferState
}, //run effect when these deps change, buffer);
然后,在音频 api 收集结束后,例如当用户点击“停止按钮”时,将缓冲区设置为您要呈现的数据。
setData(buffer)
当您不理会缓冲区时,效果将不会呈现。对于昂贵的组件和收集数据很有帮助。
有大量的边缘案例。用户需要手势才能使用音频 api。 Audio Worklets 是流,所以没有真正的方法来持久化数据。在端口上发送消息的结果相同,但更复杂。