Creé un sitio web donde si el usuario hace clic, reproduce un sonido. Para evitar que el sonido se superponga, tuve que agregar el código:
n.pause();
n.currentTime = 0;
n.play();
Pero eso causa el error:
The play() request was interrupted by a call to pause()
aparece cada vez que se activa el evento de sonido justo después de otro disparador. Los sonidos aún se reproducen bien, pero quiero evitar que este mensaje de error aparezca constantemente. ¿Algunas ideas?
javascript
html
google-chrome
audio
Owen M
fuente
fuente
onCanPlay()
. Todas estas respuestas son trucos sucios.n.play()
entoncesn.pause()
. Para eso, este artículo de Web Fundamentals describe la solución. tl; dr:n.play().then(() => { n.pause()})
Respuestas:
También me he encontrado con este problema recientemente; esto podría ser una condición de carrera entre
play()
ypause()
. Parece que hay una referencia a este problema o algo relacionado aquí .Como señala @Patrick ,
pause
no devuelve una promesa (ni nada), por lo que la solución anterior no funcionará. Si bien MDN no tiene documentospause()
, en el borrador de WC3 para Media Elements , dice:Por lo que también se puede verificar el
paused
atributo en su devolución de llamada de tiempo de espera.Con base en esta excelente respuesta SO , aquí hay una forma en que puede verificar si el video se está reproduciendo (o no) realmente, para que pueda activar una reproducción () de manera segura sin el error.
De lo contrario, la respuesta de @Patrick debería funcionar.
fuente
Después de horas de búsqueda y trabajo, encontré la solución perfecta .
Después de eso, puede alternar reproducción / pausa tan rápido como pueda, funcionará correctamente .
fuente
He encontrado este problema y tengo un caso en el que necesitaba presionar pausa () y luego reproducir () pero cuando uso pause (). Luego () me quedo indefinido.
Descubrí que si comenzaba a jugar 150 ms después de la pausa, se resolvía el problema. (Con suerte, Google lo soluciona pronto)
fuente
Acabo de publicar un artículo sobre este problema exacto en https://developers.google.com/web/updates/2017/06/play-request-was-interrupted que le dice exactamente qué está sucediendo y cómo solucionarlo .
fuente
intentalo
fuente
Esta solución me ayudó:
fuente
Dependiendo de qué tan compleja desee su solución, esto puede ser útil:
Esto es un poco exagerado, pero ayuda cuando se maneja una Promesa en escenarios únicos.
fuente
Las soluciones propuestas aquí no funcionaron para mí o eran demasiado grandes, así que estaba buscando algo más y encontré la solución propuesta por @dighan en bountysource.com/issues/
Entonces aquí está el código que resolvió mi problema:
Todavía arroja un error en la consola, pero al menos el video se está reproduciendo :)
fuente
Tal vez una mejor solución para esto, como descubrí. Spec dice como se cita de @JohnnyCoder:
-> cargarlo
indica el estado de preparación de los medios HAVE_ENOUGH_DATA = 4
Básicamente, solo cargue el video si aún no está cargado. Se produjo un error mencionado porque el video no se cargó. Quizás sea mejor que usar un tiempo de espera.
fuente
eliminado todos los errores: (mecanografiado)
fuente
Con la transmisión en vivo, me enfrentaba al mismo problema. y mi solución es esta. Desde la etiqueta de video html, asegúrese de eliminar la "reproducción automática" y use el siguiente código para jugar.
fuente
Chrome devuelve una promesa en las versiones más recientes. De lo contrario, simplemente:
fuente
Tengo el mismo problema, finalmente lo resuelvo:
fuente
¡Este fragmento de código se arregló para mí!
Código modificado de @JohnnyCoder
HTML:
JS:
fuente
Lo he arreglado con un código a continuación:
Cuando quieras jugar, usa lo siguiente:
Del mismo modo, cuando quieras hacer una pausa:
fuente
Aquí hay otra solución si la razón es que la descarga de su video es muy lenta y el video no se ha almacenado en búfer:
if (videoElement.state.paused) { videoElement.play(); } else if (!isNaN(videoElement.state.duration)) { videoElement.pause(); }
fuente
Parece que muchos programadores encontraron este problema. una solución debería ser bastante simple. retorno de elementos de medios
Promise
de accionesdebería hacer el truco
fuente
aquí hay una solución del blog de Google:
fuente
Todos los nuevos videos de soporte del navegador se reproducirán automáticamente con solo estar silenciados, así que coloque algo como esto
La URL del video debe coincidir con el estado de SSL si su sitio se ejecuta con https, entonces la URL del video también debe estar en https y lo mismo para HTTP
fuente
La solución más limpia y sencilla :
fuente
Razón uno: llamar a pausa sin esperar a que se resuelva la promesa de juego
demasiadas respuestas para este escenario, por lo que solo me referiré al mejor documento para ese problema:
https://developers.google.com/web/updates/2017/06/play-request-was-interrupted
Segunda razón: llamar al juego cuando la pestaña no está enfocada
En este caso, el navegador podría interrumpir el
play
llamandopause
cuando la pestaña no está enfocada. para ahorrar recursos para la pestaña activa.Por lo tanto, puede esperar a que la pestaña se enfoque antes de llamar al juego:
fuente
Me encontré con el mismo problema y lo resolví agregando dinámicamente el
autoplay
atributo en lugar de usarloplay()
. De esa forma, el navegador se dio cuenta de que podía jugar sin encontrarse con la condición de carrera.fuente
Al intentar que un video de reproducción automática se repita llamando
play()
cuando finaliza, la solución de tiempo de espera no funcionó para mí (por muy largo que sea el tiempo de espera).Pero descubrí que al clonar / reemplazar el video con jQuery cuando termina, se repite correctamente.
Por ejemplo:
y
Estoy usando Chrome 54.0.2840.59 (64 bits) / OS X 10.11.6
fuente
Creo que actualizaron el video html5 y desaprobaron algunos códecs. Me funcionó después de eliminar los códecs.
En el siguiente ejemplo:
fuente
Cuando ve un error con
Uncaught (in promise)
Esto solo significa que debe manejar la promesa con un.catch()
En este caso,.play()
devuelve una promesa. Puede decidir si desea registrar un mensaje, ejecutar algún código o no hacer nada, pero mientras lo tenga,.catch()
el error desaparecerá.fuente
He utilizado un truco para contrarrestar este problema. Defina una variable global var audio;
y en la verificación de funcionamiento
y en la función de parada
por lo que la próxima llamada de
audio.play
audio estará lista desde '0' currentTimesolía
pero no funcionó. Gracias.
fuente