Как нарисовать круговые звуковые волны при записи звука с помощью ReactJS? - PullRequest
0 голосов
/ 18 июня 2020

Я новичок в работе с WebAudio и getUserMedia, поэтому я пытаюсь создать этот компонент диктофона с помощью ReactJS и хочу воспроизвести что-то вроде того, что сделал Facebook в своем приложении Web Messenger.

Я могу записывать звук, но я не знаю, как отображать эти круговые звуковые волны во время записи (серая круглая область вокруг красной кнопки. enter image description here Я видел несколько примеров с полосами частот, но мне очень нравится этот дизайн, и мне было интересно, может ли кто-нибудь сказать мне, как это сделать?

Ссылка на код https://codesandbox.io/s/audio-recorder-m7pdu?file= / src / index.tsx

useRecorder() хук

import { useEffect, useState } from "react";

const useRecorder = () => {
  const [audioURL, setAudioURL] = useState("");
  const [isRecording, setIsRecording] = useState(false);
  const [recorder, setRecorder] = useState(null);

  useEffect(() => {
    // Lazily obtain recorder first time we're recording.
    if (recorder === null) {
      if (isRecording) {
        requestRecorder().then(setRecorder, console.error);
      }
      return;
    }

    // Manage recorder state.
    if (isRecording) {
      recorder.start();
    } else {
      recorder.stop();
    }

    // Obtain the audio when ready.
    const handleData = e => {
      setAudioURL(URL.createObjectURL(e.data));
    };

    recorder.addEventListener("dataavailable", handleData);
    return () => recorder.removeEventListener("dataavailable", handleData);
  }, [recorder, isRecording]);

  const startRecording = () => {
    setIsRecording(true);
  };

  const stopRecording = () => {
    setIsRecording(false);
  };

  return [audioURL, isRecording, startRecording, stopRecording];
};

async function requestRecorder() {
  const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
  return new MediaRecorder(stream);
}
export default useRecorder;

И реализация App.tsx

function App() {
  let [audioURL, isRecording, startRecording, stopRecording] = useRecorder();
  return (
    <div className="App">
      <audio src={audioURL} controls />
      <br />
      <div
        className="btn-record"
        onClick={!isRecording ? startRecording : stopRecording}
      >
        {!isRecording ? "Record" : "Stop"}
      </div>
    </div>
  );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...