Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

197
Views
¿Cómo puedo resolver el problema "HTMLMediaElement ya conectado previamente a un MediaElementSourceNode diferente" usando el componente funcional React?

Estoy usando componentes funcionales de React en mi aplicación creada con create-react-app, por lo que React.StrictMode se habilita automáticamente. No quiero deshabilitarlo, ya que me está ayudando a detectar posibles problemas a medida que me desarrollo. El problema es que hace que el componente se renderice dos veces, lo que genera un error:
DOMException no detectada: no se pudo ejecutar 'createMediaElementSource' en 'AudioContext': HTMLMediaElement ya se conectó previamente a un MediaElementSourceNode diferente cuando HTMLMediaElement se conecta en el primer procesamiento. Me pregunto, ¿hay alguna forma de desconectar HTMLMediaElement del MediaElementSourceNode anterior... tal vez establecerlo en null o algo así, para que pueda obtener una nueva conexión?
A continuación, está mi código que arroja el error:

 import React, { useEffect, useRef } from "react"; const Canvas = () => { const audioRef = useRef(null); const filUploadRef = useRef(null); const canvasRef = useRef(null); let audioSource; let analyser; let dataArray; useEffect(() => { const audioElement = audioRef.current; const canvas = canvasRef.current; const fileUploadField = filUploadRef.current; fileUploadField.addEventListener("change", () => { const audioContext = new AudioContext(); const files = fileUploadField.files; audioElement.src = URL.createObjectURL(files[0]); audioElement.load(); audioElement.play(); audioSource = audioContext.createMediaElementSource(audioElement); analyser = audioContext.createAnalyser(); audioSource.connect(analyser); analyser.connect(audioContext.destination); dataArray = new Uint8Array(analyser.frequencyBinCount); }); }, []); const handleTogglePlayPause = () => { //TODO: Implement toggle Play/Pause when the button is clicked. }; return ( <> <canvas ref={canvasRef} /> <audio controls ref={audioRef} /> <input type="file" id="file-upload" accept="audio/*" ref={filUploadRef} /> <button onClick={handleTogglePlayPause} type="button"> {/* ^ This button element is related to handleTogglePlayPause function for a different stage*/} Play/Pause </button> </> ); }; export default Canvas;
about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Puede verificar si audioSource ya tiene una fuente y, de ser así, puede intentar evitar la creación de una nueva fuente de elementos multimedia. Además, no necesita crear un nuevo analizador y conectarlo.

Agregue esto si verifica su código, y debería resolver el problema.

 // .. audioElement.play(); if (!audioSource) { audioSource = audioContext.createMediaElementSource(audioElement); analyser = audioContext.createAnalyser(); audioSource.connect(analyser); analyser.connect(audioContext.destination); } //..

Bueno, el modo de reacción estricta ayuda a identificar problemas, pero al mismo tiempo crea otros nuevos. Por lo tanto, podría considerar cerrar el modo estricto.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!