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

103
Views
Recuperar currentTime del elemento <audio> para cada evento 'timeupdate' bloquea el navegador

Estoy tratando de actualizar una variable de estado con el valor del atributo currentTime de un elemento. Agrego un detector de eventos al evento 'timeupdate' para poder llamar a setPosition con el valor de currentTime (la posición se usa para colocar la perilla en un control deslizante que representa la reproducción de la canción).

Sin embargo, recuperar audioElement.currentTime y usar el resultado como argumento para setPosition hace que mi navegador (tanto Chrome como Safari) se bloquee. De hecho, el Monitor de actividad en mi MacBook muestra que la cantidad de subprocesos que utiliza el sitio web local aumenta continuamente a medida que se reproduce el archivo de audio, pero no estoy seguro de lo que eso significa. El sitio también usa una cantidad significativa de memoria, pero SÓLO al recuperar el atributo de hora actual para cada evento de 'actualización de hora'.

No tengo idea de qué está causando problemas de rendimiento en mi componente, al menos supongo que es un problema de rendimiento.

El archivo de audio reproducido es .wav

 function SongPlayer({ file }) { const [audioElement] = useState(new Audio(file)); const [playing, setPlay] = useState(null); const [audioContext] = useState(new AudioContext({ sampleRate: 44100 })); const [gainNode] = useState(audioContext.createGain()); const [position, setPosition] = useState(0); useEffect( () => { const track = audioContext.createMediaElementSource(audioElement); track.connect(gainNode).connect(audioContext.destination); audioElement.addEventListener('timeupdate', () => { setPosition(audioElement.currentTime); }); }, [], ); useEffect( () => { if (playing) audioElement.play(); else if (!playing) audioElement.pause(); }, [playing], ); return ( <> </> ); } export default SongPlayer;

localhost usando +500 subprocesos y más de 1 Gb de memoria

EDITAR:

el problema fue cuando estaba llamando al new AudioContext() como un valor de estado inicial. El constructor estaba siendo llamado con cada renderizado .

Esta publicación me ayudó a resolverlo y lo explica bien: https://stackoverflow.com/a/64131447/13757284

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Le recomendaría que use la devolución de llamada de limpieza de useEffect para eliminar eventListener.

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!