2016-07-12 20 views
0

Ich arbeite mit einem Standard audio Element (ohne Kontrolle für den Benutzer), mit denen ich über jQuery interagieren (Quelle ändern, Wiedergabe/Pause - die gewöhnlich). Jetzt versuche ich in die nächste Spur (eines zweiten Audioelements) zu blenden, indem ich es 5 Sekunden zu früh einsetze, um einen nahtlosen Übergang zu haben.Ausführen von Javascript-Code 5 Sekunden vor HTML5 Audio-Element erreicht das Ende der Wiedergabe

Von dem, was ich gesammelt von den media events und audio element attributes Seiten gibt es keine Methode, dies standardmäßig zu tun - die nächste Sache in Existenz scheint das onended Ereignis zu sein (was zu spät ausgelöst, natürlich), und das loop Attribut, das hat das gleiche Problem.

ich meinen früheren Versuch in einer Antwort getrennt die Frage aus der unbeantwortet Warteschlange zu entfernen, aber es war ursprünglich hier

enthalten

Jede Hilfe dieses Problem habe ich verpasst, nativ in einer Art und Weise effizienter auf die Lösung oder die Verbesserung meiner bestehenden Lösung wird sehr geschätzt! Danke im Voraus.

+0

Ich bin auch dankbar für das Feedback zum Downvote, oder was für weitere Informationen Sie benötigen ... – TheThirdMan

+0

Dies ist die effizienteste Methode. Ein Anwendungsfall, an den Sie vielleicht nicht gedacht haben, ist, wenn ein Benutzer die Audiodaten überspringt, die er vermasselt. Als Endbenutzer möchte ich auch nicht, dass das Programm mit meinen Audio-Volumes und Ähnlichem verschraubt wird. – DevNebulae

+0

@GamerNebulae: Gutes Denken, ich könnte das vergessen haben. In diesem Fall ist es jedoch Hintergrundmusik, so dass der Benutzer nicht nur keine Kontrolle über die Wiedergabe erhält (mit Ausnahme des Startens und Stoppens), es sollte auch kein Problem mit dem Einblenden des nächsten Titels von a sein Interaktionsgesichtspunkt. – TheThirdMan

Antwort

1

An dieser Stelle ist die einzige Lösung, die ich sehe, ist die Dauer der Spur vor der Zeit zu überprüfen, dann legen Sie die folgende Timeout:

$('audio').bind('loadedmetadata', function() { 
    duration = $(this).prop('duration') * 1000; // get duration in milliseconds 
    var fadetimer = setTimeout(function(){ 
    // set up next audio file 
    }, duration - 5000); // execute timeout 5 seconds before end of playback 
}); 

Dies ist für mich enorm ineffizient scheint jedoch. Ich bin auch nicht sicher, ob diese Methode "Müll" Timeouts oder Ereignisbindungen im Hintergrund laufen lassen wird, die schließlich die Anwendung summieren und verlangsamen werden.

+0

Und Was passiert, wenn der Benutzer den Ton unterbricht oder wenn während der Wiedergabe etwas Latenz auftritt? Ein besserer Ansatz wäre, das Ereignis [timeupdate] (https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Media_events#timeupdate) zu verwenden, wenn 'audio.currentTime === audio. Dauer - 5' rufen Sie dann Ihre Funktion auf. – Kaiido

+0

@Kaiido: Ich hätte das jetzt zu der Frage hinzufügen müssen, aber wie ich zu der Frage kommentiert habe, hat der Benutzer in meinem Fall keine Steuerelemente für das Audio - es ist einfach Hintergrund-Audio. Der "timeupdate" -Ansatz wurde von einem anderen Benutzer in den Kommentaren angedeutet, aber für meinen Fall schien diese Methode weniger ressourcenintensiv zu sein. Natürlich, wenn Sie nicht zustimmen oder einen anderen Punkt haben, können Sie es als Antwort posten, und ich werde es ausprobieren! – TheThirdMan