Estoy reproduciendo un pequeño clip de audio al hacer clic en cada enlace de mi navegación
Código HTML:
<audio tabindex="0" id="beep-one" controls preload="auto" >
<source src="audio/Output 1-2.mp3">
<source src="audio/Output 1-2.ogg">
</audio>
Código JS:
$('#links a').click(function(e) {
e.preventDefault();
var beepOne = $("#beep-one")[0];
beepOne.play();
});
Funciona bien hasta ahora.
El problema es cuando ya se está ejecutando un clip de sonido y hago clic en cualquier enlace, no sucede nada.
Traté de detener el sonido que ya se reproduce al hacer clic en el enlace, pero no hay un evento directo para eso en la API de audio de HTML5
Intenté seguir el código pero no funciona
$.each($('audio'), function () {
$(this).stop();
});
¿Alguna sugerencia por favor?
html
html5-audio
Alok Jain
fuente
fuente
<audio>
carga continúa también con elpreload
atributo forzadonone
y el<source>
src de 's eliminado.primero tienes que configurar una identificación para tu elemento de audio
en tu js:
var ply = document.getElementById('player');
var oldSrc = ply.src;
// solo para recordar la antigua fuenteply.src = "";
// para detener el reproductor tienes que reemplazar la fuente con nadafuente
Aquí está mi forma de hacer el método stop ():
En algún lugar del código:
y luego en stop ():
De esta manera, no producimos solicitudes adicionales, la anterior se cancela y nuestro elemento de audio está en estado limpio (probado en Chrome y FF):>
fuente
Estaba teniendo el mismo problema. Una parada debe detener el flujo y onplay ir a vivo si se trata de una radio. Todas las soluciones que vi tenían una desventaja :
player.currentTime = 0
sigue descargando la transmisión.player.src = ''
elevarerror
eventoMi solución:
Y el HTML
fuente
Security Error: Content at https://localhost/url.html may not load data from blob:https://localhost/cac32534-78b0-4a62-8355-cc8f1e708d64.
] Parece que no tiene ningún efecto negativo ya que el código continúa ejecutándose después de esto (a diferencia de una excepción no detectada).Este método funciona:
Pero si no desea tener que escribir estas dos líneas de código cada vez que detiene un audio, puede hacer una de dos cosas. El segundo creo que es el más apropiado y no estoy seguro de por qué los "dioses de los estándares de JavaScript" no han hecho este estándar.
Primer método: crear una función y pasar el audio
Segundo método (preferido): ampliar la clase de audio:
Tengo esto en un archivo javascript que llamé "AudioPlus.js" que incluyo en mi html antes de cualquier script que se ocupe del audio.
Luego puede llamar a la función de parada en objetos de audio:
FINALMENTE CROMO PROBLEMA CON "canplaythrough":
No he probado esto en todos los navegadores, pero este es un problema que encontré en Chrome. Si intenta establecer currentTime en un audio que tiene un detector de eventos "canplaythrough" adjunto, activará ese evento nuevamente, lo que puede generar resultados no deseados.
Entonces, la solución, similar a todos los casos en los que ha adjuntado un detector de eventos que realmente desea asegurarse de que no se vuelva a activar, es eliminar el detector de eventos después de la primera llamada. Algo como esto:
PRIMA:
Tenga en cuenta que puede agregar aún más métodos personalizados a la clase de audio (o cualquier clase nativa de JavaScript para el caso).
Por ejemplo, si deseaba un método de "reinicio" que reiniciara el audio, podría verse así:
fuente
function stopAudio(audio) { audio.pause(); this.audioStream.src = ""; }
Hacer esto terminó funcionando para mí y eliminó el ícono del altavoz en el navegador Chrome que aparece cuando se reproduce audio en la página. probado en Chrome versión 59.0.3071.109Desde mi propia función de JavaScript para alternar Reproducir / Pausa: dado que estoy manejando una transmisión de radio, quería que borrara el búfer para que el oyente no termine fuera de sincronización con la estación de radio.
Resulta que simplemente borrar el CurrentTime no lo corta en Chrome, también es necesario borrar la fuente y volver a cargarla. Espero que esto ayude.
fuente
Como nota al margen y porque recientemente estaba usando el método de detención proporcionado en la respuesta aceptada, de acuerdo con este enlace:
https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Media_events
configurando currentTime manualmente, se puede activar el evento 'canplaythrough' en el elemento de audio. En el enlace menciona Firefox, pero encontré este evento disparando después de configurar currentTime manualmente en Chrome. Entonces, si tiene un comportamiento asociado a este evento, puede terminar en un bucle de audio.
fuente
A veces no funciona en cromo,
solo cambia así,
fuente
Shamangeorge escribió:
De hecho, esto es lo que sucederá, y la pausa también desencadenará el
pause
evento, lo que hace que esta técnica no sea adecuada para su uso como método de "detención". Por otra parte, si configura lasrc
opción sugerida por zaki, el jugador intentará cargar la URL de la página actual como un archivo multimedia (y fallará) siautoplay
está habilitada; la configuraciónsrc
anull
no está permitida; siempre se tratará como una URL. A falta de destruir el objeto del jugador, parece que no hay una buena manera de proporcionar un método de "detención", por lo que sugeriría simplemente soltar el botón de detención dedicado y proporcionar en su lugar botones de pausa y saltar hacia atrás: un botón de detención realmente no agregaría ninguna funcionalidad .fuente
Este enfoque es "fuerza bruta", pero funciona suponiendo que el uso de jQuery está "permitido". Rodea tus
<audio></audio>
etiquetas de "jugador" con un div (aquí con una identificación de "plHolder").Entonces este javascript debería funcionar:
fuente
#FlHolder
Parece un error tipográfico para#plHolder
src
atributo del jugador.Creo que sería bueno verificar si el audio se está reproduciendo y restablecer la propiedad currentTime.
fuente
para mí ese código funciona bien. (IE10 +)
Espero que esto ayude.
fuente
Lo que me gusta hacer es eliminar completamente el control usando Angular2 y luego se vuelve a cargar cuando la siguiente canción tiene una ruta de audio:
Luego, cuando quiero descargarlo en el código, hago esto:
Cuando se asigna la siguiente canción, el control se recrea completamente desde cero:
fuente
La forma simple de evitar este error es detectar el error.
audioElement.play () devuelve una promesa, por lo que el siguiente código con un .catch () debería ser suficiente para manejar este problema:
Nota: es posible que desee reemplazar la función de flecha con una función anónima para la compatibilidad con versiones anteriores.
fuente