Ich spiele einen kleinen Audioclip ab, indem ich auf jeden Link in meiner Navigation klicke
HTML Quelltext:
<audio tabindex="0" id="beep-one" controls preload="auto" >
<source src="audio/Output 1-2.mp3">
<source src="audio/Output 1-2.ogg">
</audio>
JS-Code:
$('#links a').click(function(e) {
e.preventDefault();
var beepOne = $("#beep-one")[0];
beepOne.play();
});
Bisher funktioniert es gut.
Problem ist, wenn ein Soundclip bereits läuft und ich auf einen Link klicke, passiert nichts.
Ich habe versucht, den bereits wiedergegebenen Sound beim Klicken auf den Link zu stoppen, aber es gibt kein direktes Ereignis dafür in der Audio-API von HTML5
Ich habe versucht, folgenden Code zu verwenden, aber es funktioniert nicht
$.each($('audio'), function () {
$(this).stop();
});
Irgendwelche Vorschläge bitte?
html
html5-audio
Alok Jain
quelle
quelle
<audio>
geladen, wobei daspreload
Attribut erzwungennone
und der<source>
src entfernt wird.Zuerst müssen Sie eine ID für Ihr Audioelement festlegen
in deinem js:
var ply = document.getElementById('player');
var oldSrc = ply.src;
// nur um sich an die alte Quelle zu erinnernply.src = "";
// Um den Player zu stoppen, müssen Sie die Quelle durch nichts ersetzenquelle
Hier ist meine Art, die stop () -Methode auszuführen:
Irgendwo im Code:
und dann in stop ():
Auf diese Weise erzeugen wir keine zusätzliche Anfrage, die alte wird abgebrochen und unser Audioelement befindet sich in einem sauberen Zustand (getestet in Chrome und FF):>
quelle
Ich hatte das gleiche Problem. Ein Stopp sollte den Stream stoppen und das Onplay wird live geschaltet, wenn es sich um ein Radio handelt. Alle Lösungen, die ich sah, hatten einen Nachteil :
player.currentTime = 0
lädt den Stream weiter herunter.player.src = ''
error
Ereignis auslösenMeine Lösung:
Und der HTML
quelle
Security Error: Content at https://localhost/url.html may not load data from blob:https://localhost/cac32534-78b0-4a62-8355-cc8f1e708d64.
] Es scheint keine negativen Auswirkungen zu haben, da der Code danach weiter ausgeführt wird (im Gegensatz zu einer nicht erfassten Ausnahme).Diese Methode funktioniert:
Wenn Sie diese beiden Codezeilen jedoch nicht jedes Mal schreiben müssen, wenn Sie ein Audio stoppen, können Sie eines von zwei Dingen tun. Das zweite ist meiner Meinung nach das passendere und ich bin mir nicht sicher, warum die "Götter der Javascript-Standards" diesen Standard nicht gemacht haben.
Erste Methode: Erstellen Sie eine Funktion und übergeben Sie das Audio
Zweite Methode (bevorzugt): Erweitern Sie die Audio-Klasse:
Ich habe dies in einer Javascript-Datei namens "AudioPlus.js", die ich in mein HTML vor jedem Skript einbinde, das sich mit Audio befasst.
Dann können Sie die Stoppfunktion für Audioobjekte aufrufen:
ENDLICH CHROM AUSGABE MIT "canplaythrough":
Ich habe dies nicht in allen Browsern getestet, aber dies ist ein Problem, auf das ich in Chrome gestoßen bin. Wenn Sie versuchen, currentTime für ein Audio festzulegen, an das ein Ereignis-Listener "Durchspielen" angehängt ist, lösen Sie dieses Ereignis erneut aus, was zu unerwünschten Ergebnissen führen kann.
Ähnlich wie in allen Fällen, in denen Sie einen Ereignis-Listener angehängt haben, um sicherzustellen, dass er nicht erneut ausgelöst wird, besteht die Lösung darin, den Ereignis-Listener nach dem ersten Aufruf zu entfernen. Etwas wie das:
BONUS:
Beachten Sie, dass Sie der Audio-Klasse (oder einer beliebigen nativen Javascript-Klasse) noch mehr benutzerdefinierte Methoden hinzufügen können.
Wenn Sie beispielsweise eine "Neustart" -Methode wünschen, mit der das Audio neu gestartet wird, könnte dies folgendermaßen aussehen:
quelle
function stopAudio(audio) { audio.pause(); this.audioStream.src = ""; }
Dies funktionierte für mich und entfernte das Lautsprechersymbol im Chrome Browser, das angezeigt wird, wenn Audio auf der Seite abgespielt wird. getestet auf Chrome Version 59.0.3071.109Von meiner eigenen Javascript-Funktion zum Umschalten von Wiedergabe / Pause - da ich einen Radiostream verarbeite, wollte ich, dass dieser den Puffer löscht, damit der Hörer nicht nicht mehr mit dem Radiosender synchronisiert ist.
Es stellt sich heraus, dass nur das Löschen der currentTime nicht unter Chrome abgeschnitten wird. Sie müssen auch die Quelle löschen und wieder laden. Ich hoffe, dies hilft.
quelle
Als Randnotiz und weil ich kürzlich die in der akzeptierten Antwort angegebene Stoppmethode verwendet habe, laut diesem Link:
https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Media_events
Durch manuelles Einstellen von currentTime kann das Ereignis 'canplaythrough' auf dem Audioelement ausgelöst werden. In dem Link wird Firefox erwähnt, aber dieses Ereignis wurde ausgelöst, nachdem currentTime manuell in Chrome eingestellt wurde. Wenn Sie also ein Verhalten mit diesem Ereignis verknüpft haben, könnten Sie in einer Audio-Schleife enden.
quelle
Es funktioniert manchmal nicht in Chrom,
ändere dich einfach so,
quelle
Shamangeorge schrieb:
Dies ist in der Tat der Fall, und eine Pause löst auch das
pause
Ereignis aus. Beides macht diese Technik für die Verwendung als "Stopp" -Methode ungeeignet.src
Wenn Sie die von zaki vorgeschlagene Einstellung festlegen, versucht der Player außerdem, die URL der aktuellen Seite als Mediendatei zu laden (und schlägt fehl), wenn dieseautoplay
Option aktiviert ist. Die Einstellungsrc
aufnull
ist nicht zulässig. Es wird immer als URL behandelt. Ohne das Player-Objekt zu zerstören, scheint es keine gute Möglichkeit zu geben, eine "Stopp" -Methode bereitzustellen. Daher würde ich vorschlagen, einfach die dedizierte Stopp-Taste fallen zu lassen und stattdessen Pausen- und Rücksprung-Tasten bereitzustellen - eine Stopp-Taste würde keine wirklichen Funktionen hinzufügen .quelle
Dieser Ansatz ist "Brute Force", funktioniert jedoch unter der Annahme, dass die Verwendung von jQuery "zulässig" ist. Umgeben Sie Ihre "Player"
<audio></audio>
-Tags mit einem Div (hier mit der ID "plHolder").Dann sollte dieses Javascript funktionieren:
quelle
#FlHolder
scheint ein Tippfehler für#plHolder
src
Attribut des Spielers.Ich glaube, es wäre gut zu überprüfen, ob das Audio wiedergegeben wird, und die Eigenschaft currentTime zurückzusetzen.
quelle
Für mich funktioniert dieser Code einwandfrei. (IE10 +)
Ich hoffe das hilft.
quelle
Was ich gerne mache, ist das Steuerelement mit Angular2 vollständig zu entfernen und es dann neu zu laden, wenn der nächste Song einen Audiopfad hat:
Wenn ich es dann im Code entladen möchte, mache ich Folgendes:
Wenn das nächste Lied zugewiesen wird, wird das Steuerelement von Grund auf neu erstellt:
quelle
Der einfache Weg, um diesen Fehler zu umgehen, besteht darin, den Fehler abzufangen.
audioElement.play () gibt ein Versprechen zurück, daher sollte der folgende Code mit .catch () ausreichen, um dieses Problem zu beheben:
Hinweis: Möglicherweise möchten Sie die Pfeilfunktion aus Gründen der Abwärtskompatibilität durch eine anonyme Funktion ersetzen.
quelle