我正在尝试编写一个 React Hook 来处理流音频到 AudioContext,并使用 Meyda 进行分析。
https://meyda.js.org/ https://meyda.js.org/
我已经设法使流正常工作并能够提取我想要的数据。但是,我在取消初始化音频时遇到问题。
如果有人能为我提供一些有关正确设置此挂钩的指导,我将不胜感激。
当我使用这些钩子离开页面时,当前收到以下错误:
警告:无法对已卸载的组件执行 React 状态更新。这是一个空操作,但它表明应用程序中存在内存泄漏。要修复此问题,请取消 useEffect 清理函数中的所有订阅和异步任务。
我尝试在钩子末尾添加清理功能,但我的尝试经常以音频立即切断或出现任何其他奇怪的错误而结束。
带 Meyda 分析仪的麦克风音频挂钩
export const useMeydaAnalyser = () => {
const [running, setRunning] = useState(false);
const [features, setFeatures] = useState(null);
const featuresRef = useRef(features);
const audioContext = useRef(new AudioContext());
const getMedia = async() => {
try {
return await navigator
.mediaDevices
.getUserMedia({audio: true, video: false});
} catch(err) {
console.log('Error:', err);
}
};
useEffect(
() => {
const audio = audioContext.current;
let unmounted = false;
if(!running) {
getMedia().then(stream => {
if (unmounted) return;
setRunning(true);
const source = audio.createMediaStreamSource(stream);
const analyser = Meyda.createMeydaAnalyzer({
audioContext: audio,
source: source,
bufferSize: 1024,
featureExtractors: [
'amplitudeSpectrum',
'mfcc',
'rms',
],
callback: nextFeatures => {
if(!isEqual(featuresRef.current, nextFeatures)) {
setFeatures(nextFeatures);
}
},
});
analyser.start();
});
}
return () => {
unmounted = true;
}
},
[running, audioContext],
);
useEffect(
() => {
featuresRef.current = features;
},
[features],
);
return features;
};
音频视图
import React, {useEffect} from 'react';
import { useMeydaAnalyser } from '../hooks/use-meyda-audio';
const AudioViewDemo = () => {
const audioContext = new AudioContext();
const features = useMeydaAnalyser(audioContext);
useEffect(() => {
// Todo: Handle Audio features
console.log(features);
// setAudioData(features);
}, [features]);
return (
<div>
RMS: {features && features.rms}
</div>
);
};
export default AudioViewDemo;