Je joue un petit clip audio en cliquant sur chaque lien dans ma navigation
Code 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>
Code JS:
$('#links a').click(function(e) {
e.preventDefault();
var beepOne = $("#beep-one")[0];
beepOne.play();
});
Cela fonctionne bien jusqu'à présent.
Le problème est lorsqu'un clip audio est déjà en cours d'exécution et que je clique sur un lien, rien ne se passe.
J'ai essayé d'arrêter le son déjà lu en cliquant sur le lien, mais il n'y a pas d'événement direct pour cela dans l'API audio de HTML5
J'ai essayé de suivre le code mais cela ne fonctionne pas
$.each($('audio'), function () {
$(this).stop();
});
Des suggestions s'il vous plaît?
html
html5-audio
Alok Jain
la source
la source
<audio>
chargement continue également avec l'preload
attribut forcé ànone
et le<source>
src supprimé.vous devez d'abord définir un identifiant pour votre élément audio
dans votre js:
var ply = document.getElementById('player');
var oldSrc = ply.src;
// juste pour se souvenir de l'ancienne sourceply.src = "";
// pour arrêter le lecteur, vous devez remplacer la source par rienla source
Voici ma façon de faire la méthode stop ():
Quelque part dans le code:
puis en stop ():
De cette façon, nous ne produisons pas de demande supplémentaire, l'ancienne est annulée et notre élément audio est en état propre (testé dans Chrome et FF):>
la source
J'avais le même problème. Un arrêt devrait arrêter le flux et passer en direct s'il s'agit d'une radio. Toutes les solutions que j'ai vues avaient un inconvénient :
player.currentTime = 0
continue de télécharger le flux.player.src = ''
élever unerror
événementMa solution:
Et le HTML
la source
Security Error: Content at https://localhost/url.html may not load data from blob:https://localhost/cac32534-78b0-4a62-8355-cc8f1e708d64.
] Il semble n'avoir aucun effet négatif car le code continue à s'exécuter après cela (contrairement à une exception non interceptée).Cette méthode fonctionne:
Mais si vous ne voulez pas avoir à écrire ces deux lignes de code chaque fois que vous arrêtez un audio, vous pouvez faire l'une des deux choses. Je pense que le second est le plus approprié et je ne sais pas pourquoi les "dieux des standards javascript" n'ont pas fait ce standard.
Première méthode: créer une fonction et passer l'audio
Deuxième méthode (privilégiée): étendre la classe Audio:
J'ai ceci dans un fichier javascript que j'ai appelé "AudioPlus.js" que j'inclus dans mon html avant tout script qui traitera de l'audio.
Ensuite, vous pouvez appeler la fonction d'arrêt sur les objets audio:
ENFIN PROBLÈME CHROME AVEC "canplaythrough":
Je n'ai pas testé cela dans tous les navigateurs mais c'est un problème que j'ai rencontré dans Chrome. Si vous essayez de définir currentTime sur un audio auquel un écouteur d'événement «canplaythrough» est attaché, vous déclencherez à nouveau cet événement, ce qui peut conduire à des résultats indésirables.
Ainsi, la solution, similaire à tous les cas où vous avez attaché un écouteur d'événement dont vous voulez vraiment vous assurer qu'il ne se déclenche pas à nouveau, est de supprimer l'écouteur d'événement après le premier appel. Quelque chose comme ça:
PRIME:
Notez que vous pouvez ajouter encore plus de méthodes personnalisées à la classe Audio (ou à toute classe JavaScript native d'ailleurs).
Par exemple, si vous vouliez une méthode de "redémarrage" qui redémarrait l'audio, cela pourrait ressembler à quelque chose comme:
la source
function stopAudio(audio) { audio.pause(); this.audioStream.src = ""; }
Cela a fini par fonctionner pour moi et j'ai supprimé l'icône du haut-parleur dans le navigateur Chrome qui apparaît lors de la lecture audio sur la page. testé sur Chrome Version 59.0.3071.109De ma propre fonction javascript pour basculer Play / Pause - puisque je gère un flux radio, je voulais qu'il efface le tampon afin que l'auditeur ne finisse pas par se désynchroniser avec la station de radio.
Il s'avère que le simple fait d'effacer le currentTime ne le coupe pas sous Chrome, il faut également effacer la source et la recharger. J'espère que cela vous aidera.
la source
En remarque et parce que j'utilisais récemment la méthode d'arrêt fournie dans la réponse acceptée, selon ce lien:
https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Media_events
en définissant currentTime manuellement, on peut déclencher l'événement «canplaythrough» sur l'élément audio. Dans le lien, il mentionne Firefox, mais j'ai rencontré cet événement se déclenchant après avoir défini currentTime manuellement sur Chrome. Donc, si vous avez un comportement associé à cet événement, vous risquez de vous retrouver dans une boucle audio.
la source
Cela ne fonctionne pas parfois dans Chrome,
change juste comme ça,
la source
shamangeorge a écrit:
C'est en effet ce qui va se passer, et une pause déclenchera également l'
pause
événement, ce qui rendra cette technique impropre à une utilisation comme méthode "d'arrêt". De plus, en définissantsrc
comme suggéré par zaki, le lecteur essaiera de charger l'URL de la page actuelle en tant que fichier multimédia (et échouera) siautoplay
est activé - le réglagesrc
surnull
n'est pas autorisé; il sera toujours traité comme une URL. À moins de détruire l'objet joueur, il ne semble pas y avoir de bon moyen de fournir une méthode "d'arrêt", donc je suggérerais simplement de laisser tomber le bouton d'arrêt dédié et de fournir des boutons de pause et de retour arrière à la place - un bouton d'arrêt n'ajouterait pas vraiment de fonctionnalité .la source
Cette approche est «force brute», mais elle fonctionne en supposant que l'utilisation de jQuery est «autorisée». Entourez vos
<audio></audio>
balises "player" avec un div (ici avec un id de "plHolder").Ensuite, ce javascript devrait fonctionner:
la source
#FlHolder
semble une faute de frappe pour#plHolder
src
attribut du joueur.Je pense qu'il serait bon de vérifier si l'audio est en cours de lecture et de réinitialiser la propriété currentTime.
la source
pour moi, ce code fonctionne bien. (IE10 +)
J'espère que cette aide.
la source
Ce que j'aime faire, c'est supprimer complètement le contrôle en utilisant Angular2, puis il est rechargé lorsque la chanson suivante a un chemin audio:
Ensuite, lorsque je veux le décharger dans le code, je fais ceci:
Lorsque le morceau suivant est attribué, le contrôle est complètement recréé à partir de zéro:
la source
Le moyen simple de contourner cette erreur est de détecter l'erreur.
audioElement.play () renvoie une promesse, donc le code suivant avec un .catch () devrait suffire à gérer ce problème:
Remarque: vous souhaiterez peut-être remplacer la fonction flèche par une fonction anonyme pour des raisons de compatibilité descendante.
la source