Ich erhielt eine E-Mail von einem Notary Sojac, der mein Tutorial zum Thema Sound auf Hover abspielen gesehen hatte. In diesem Tutorial mussten wir zu ziemlich hackigen Verhaltensweisen greifen, um den Sound schön auf unsere Ereignisse reagieren zu lassen. Notary Sojac hatte ein Update, um den bestehenden Code besser funktionieren zu lassen, aber wichtiger noch, er untersuchte die Web Audio API, um solche Dinge zu tun. Ich wusste nicht einmal, dass es so etwas gibt. Es stellt sich heraus, dass es nicht die HTML5-Audioelemente steuert, sondern einen tieferen Zugriff als das ermöglicht.
Das Folgende ist ein Gastbeitrag von Notary Sojac, der alles erklärt.
Wir sind alle beeindruckt von den Fähigkeiten des HTML5 Canvas. Die Idee, eine standardisierte und logische Methode zum Ausführen von 2D-Zeichenoperationen zu schaffen, eröffnete eine erstaunliche neue Welt, in der ein Programmierer eine Sprache lernen und erstaunliche Produkte entwickeln konnte, die auf allen relevanten Plattformen bereitgestellt werden konnten! Denken Sie einen Moment darüber nach, wie wichtig das ist. Denken Sie nun darüber nach, wer eine erstaunliche Grafik-Anwendung mit einem fehlerhaften, glitchen Sound-System haben möchte, das nur Momente nach dem Klicken Töne wiedergibt und manchmal sogar vergisst, Töne wiederzugeben? Das ist die Art von Produkt, die Sie erhalten (besonders auf mobilen Plattformen), wenn Sie den HTML5 <audio> Elementpfad wählen. In Desktop-Browsern ist es besser, aber leider wird es aus Gründen, die über den Rahmen dieses Artikels hinausgehen, niemals perfektioniert werden. Aber im Moment gibt es für den Desktop noch Hoffnung. Und es gibt auch in Zukunft Hoffnung für mobile Anwendungen. Diese Hoffnung heißt...
Web Audio API
Die Web Audio API ist für hohe Präzision und Low-Level-Zugriff konzipiert. Man kann buchstäblich Datenbits an die Samples schreiben. Ich bin mir nicht zu 100% sicher, was ein Sample ist, aber ich glaube, es hat etwas mit Luftdruck gegen ein Mikrofon (aka, die Position des Mikrofon-Treibers) zu einem bestimmten Zeitpunkt zu tun. Das ist ziemlich Low-Level, wenn Sie mich fragen. In Google Chrome werden alle Audiofunktionen in einem separaten Thread verarbeitet, um "Nicht-Wonkyness" zu gewährleisten.
Am 21. August begann Mozilla öffentlich bekannt zu geben, dass sie ihre ursprüngliche, wegweisende "Audio Data API" fallen lassen und beginnen, Googles "Web Audio API" in ihrem Browser zu implementieren. Aber das bedeutet, zum Zeitpunkt des Schreibens, dass Sie einen Fallback für Firefox verwenden müssen.
Von Chris Wilson gibt es hier eine gute Zusammenfassung in diesem Google I/O-Talk
Anwendung
Leider benötigt man mit der Web Audio API deutlich mehr JavaScript als mit einfachen HTML5-Audioelementen, aber oft ist die Präzision der Web Audio API unerlässlich.
Zuerst müssen wir den Sound laden, was mit einer Funktion wie dieser geschehen kann
// you'll put the PCM audio in here
var audioBuffer = null;
var context = new webkitAudioContext();
function loadDogSound(url, variableToBufferSound) {
var request = new XMLHttpRequest();
request.open('GET', url, true);
request.responseType = 'arraybuffer';
// Decode asynchronously
request.onload = function() {
context.decodeAudioData(request.response, function(buffer) {
variableToBufferSoundIn = buffer;
}, onError);
}
request.send();
}
Dann spielen wir den Puffer ab, mit einer Funktion wie dieser
function playSound(buffer) {
// creates a sound source
var source = context.createBufferSource();
// tell the source which sound to play
source.buffer = buffer;
// connect the source to the context's destination (the speakers)
source.connect(context.destination);
// play the source now
source.noteOn(0);
}
Das ist viel mehr Code, als wir als Designer benötigen, die nur einfache Mouseover-Soundeffekte abspielen wollen. Glücklicherweise habe ich ein kleines JavaScript-Framework für die Verwendung der Web Audio API zusammengebastelt.
Mit dieser neuen API muss man nur noch
- einen AudioContext erstellen
- einen Sound in diesen AudioContext laden
- den Sound abspielen
All diese Schritte sind Einzeiler! Fallbacks auf gutes altes HTML5 sind inklusive!
<script src="javascripts/webAudioApiForDesigners.js"></script>
<script>
// 1
var context = initializeNewWebAudioContext();
// 2
context.loadSound('audio/beep.ogg', 'beep');
$("#nav-one a")
.mouseenter(function() {
// 3
context.playSound('beep');
});
</script>
Gründe, warum HTML5-Audioelemente eine schlechte Wahl sein können
- Probleme mit der Latenz, bei denen Töne zu falschen Zeiten abgespielt werden
- Unerklärliche Knackgeräusche beim gleichzeitigen Abspielen mehrerer Audiodateien
- Begrenzung der Anzahl von HTML5-Audioelementen, die gleichzeitig abgespielt werden können
Gründe, warum HTML5 für Ihr Projekt besser geeignet sein könnte
- Sehr einfach und unkompliziert zu bedienen
- Kann Hintergrundmusik problemlos abspielen
- Irgendwann ( wilde Vermutung: nicht früher als in den nächsten 3 Jahren ) werden die Fehler in diesen HTML-DOM-Elementen behoben sein
Weitere Informationen
HTML5 Rocks hat eine solide Einführung.
Tolle Sache! Schönes Framework, genau das, was gebraucht wird. Mit etwas Glück könnten die jQuery-Leute einige dieser Dinge in eine zukünftige Version integrieren!
Ich hätte gerne eine Version davon, die funktioniert, indem man bestimmte Töne bestimmten Tasten zuweist, damit ich ein einfaches Drum-Machine/Keyboard/Synth erstellen kann.
Hilfe wäre sehr willkommen.
OMG, du hast Recht! Wir werden in der Lage sein, beliebige synthetisierte Klänge, wie Orgeln, Bassgitarren, was auch immer, direkt von der Tastatur aus abzuspielen. Die Möglichkeiten mit MIDI sind endlos. Und die Tastatur hat so viele Tasten, dass es ziemlich cool wird. Jemand wird das aufgreifen und sich einen Namen machen.
@Louis
http://stuartmemo.com/qwerty-hancock/
@Norman
Ich befürchte, das ist nicht wirklich der Fall. Die Steuerung von Audio in Echtzeit ist ohne erhebliche Verzögerung nicht möglich. Die Flash-Audio-API gibt es schon seit einigen Jahren mit voller MIDI-Unterstützung und demselben Problem. Deshalb benötigen wir immer noch geringe Latenz (ASIO)-Soundkarten.
@28inch verstanden, danke für die zusätzlichen Informationen, das wusste ich nicht.
@louis
http://www.schillmania.com/projects/soundmanager2/demo/mpc/
Ich habe gerade mit Safari gesurft, auf den Demo-Button geklickt und die Fallback-Nachricht erhalten ("Web Audio API wird in diesem Browser nicht unterstützt. HTML 5 Audio-Elemente werden stattdessen verwendet."), nur gibt es keinen Ton. Ich bin mir nicht sicher warum. In Firefox, das auch den HTML5-Fallback verwendet, ist der Ton vorhanden.
Ich habe Firefox und ich habe auch die Nachricht erhalten, und die Töne gehört, und mich gefragt, wie das möglich ist, besonders nachdem ich den Quellcode angesehen und keine HTML5-Audio-Tags gesehen habe. Weiß jemand, wie das möglich ist?
Nur die allerneueste Safari-Version unterstützt die Web Audio API. Es scheint, als ob Apple diese Software von Benutzern zurückhält, die nicht die neueste Version von Apple gekauft haben. Dies macht es für Linux- und Windows-Entwickler schwieriger, Lösungen für diese Plattform zu entwickeln, und für Apple-Benutzer, die keine Zeit haben, Schritt zu halten, wo sie die neueste Version kaufen können und ob ihr System berechtigt ist. Die gute Nachricht ist, dass die Web Audio API auf neueren mobilen Plattformen zugelassen wird, also Hut ab vor Apple.
Es erscheint mysteriös (aber wahr), dass Apple nur das .mp3-Format mit seinem Webbrowser unterstützt. Die Entscheidung ergibt für mich nur Sinn, wenn sie Zahlungen VON den MP3-Patenthaltern erhalten, anstatt ihnen Geld auszuzahlen. FF wird sich nicht in dieser Weise verhalten, wenn es bereit ist (es ist immer noch dabei, die Technologie zu übernehmen). Und offensichtlich ist der Chrome-Browser so konzipiert, dass er mit offenen Standards wie .ogg und webm funktioniert.
Ich habe es geschafft, zu einem Apple Store zu gehen und mir die Dinge anzusehen (meine Bibliotheken haben nur PCs) und wie ich vermutet hatte, führte das Ändern des Codes zum Laden einer mp3 anstelle einer ogg zu einem Erfolg. Es scheint eine kleinkarierte Aufgabe für Apple zu sein, die ich mit ihnen eine Weile lang beklagen werde, und dann das Framework aktualisieren werde, um Fallback-Formate auf clevere und logische Weise zu unterstützen. Im Moment wechsle ich mein Betriebssystem zu Linux Mint, daher muss ich viele Entwicklungsumgebungen einrichten und ich muss Bacula-Wartungsarbeiten erledigen.
Dies wird das Problem lösen..
Fehler "Etwas Suboptimales ist passiert"
wenn Sie etwas wie ... tun
context.loadSound([‘audio/beep.mp3’], [‘audio/beep.ogg’], ‘beep’);
ODER vielleicht auch so etwas wie das hier...
context[‘beep’].loadFallbackSound(‘audio/beep.mp3’)
Aber geben Sie mir ein oder zwei Tage, um das zu kodieren.
Und *ich* bekam
„Etwas Suboptimales ist passiert, als versucht wurde, einige Audio-Daten zu dekodieren.“
(in Safari 6.0)
Ein allgemeiner Grund, warum überhaupt keine Audio-Elemente auf Websites verwendet werden sollten: Sie sind einfach und schlicht nervig! Das Gleiche gilt für Smartphones, die beim Berühren Töne von sich geben, oder Kameras, die Geräusche als Standard machen. Okay, das ist eine persönliche Meinung, aber wenn Sie öffentliche Verkehrsmittel nutzen, wissen Sie, was hinter meiner Aussage steckt...
Zustimmung.
Wenn ich höre, wie die meisten Websites einen Ton abspielen, schließe ich instinktiv mit ⌘W.
Natürlich sind Töne weiterhin für Spiele oder Videos/Animationen angemessen.
„XMLHttpRequest kann . nicht laden. – Ursprungsübergreifende Anfragen werden nur für HTTP unterstützt.“
Gibt es eine Möglichkeit, es in einer lokalen Umgebung zum Laufen zu bringen?
Benutzen Sie Lokal mit einem WAMP-Server, sodass es wie folgt aussieht
https:///etc/
denn technisch gesehen ist das http
Nun, ich habe versucht, es in MAMP auszuführen, aber ich bekomme diese Fehlermeldung
„Etwas suboptimales ist passiert, als versucht wurde, einige Audio-Daten zu dekodieren.“
sdfsdfsdfsdfsdfsdf s sa sf à á f sà sa ssf
sdfdfdfsdf
sf
sdf
sdf
sf
sdf
Auch ich habe einige seltsame Meldungen in Safari erhalten, als ich die Demo besuchte. In Chrome funktioniert es jedoch perfekt.
Es sieht so aus, als ob die Unterstützung für die Web Audio API in Safari wackelig ist, da sie gerade mit der neuesten Version 6.0 eingeführt wurde. Vielleicht wird die Unterstützung nach einer Weile zuverlässiger. http://www.html5audio.org/2012/07/safari-6-arrives-bringing-web-audio-api-to-apples-browser.html
Wenn Sie wirklich "etwas" mit Ton auf Hover benötigen, das auf einer Vielzahl von Plattformen funktioniert, müssten Sie wahrscheinlich eine Browsererkennung einrichten und eine Flash-Version für ältere Geräte bereitstellen. Igitt.
Flüssiger als die alte Version. Gute Arbeit :)
Es klingt, als gäbe es viele technische Probleme, um Töne genau dann abzuspielen, wenn man sie haben möchte. In Anbetracht dessen ist mein Vorschlag vielleicht technisch nicht machbar, aber warum deckt CSS keine Töne ab, die beim Hovern abgespielt werden sollten? CSS kümmert sich um die Präsentation des Markup, aber so ziemlich nur visuell. Warum kümmert sich CSS nicht um diese Art der Audio-Präsentation? Wenn Sie möchten, dass sich ein Button beim Hovern verfärbt, verwenden Sie CSS. Warum ist es so, dass, wenn Sie möchten, dass ein Button beim Hovern piept, das nicht CSS ist? Warum kümmert sich CSS nicht um einen Ton, den Sie bei :target abspielen möchten? Was ist mit dem Ende einer CSS-Animation, wie einer z-Index-Animation?
Großartig. Ich werde das ausprobieren müssen.
Ich habe schon seit vielen Jahren Töne auf Websites abgespielt gesehen (z.B. beim Hovern über ein Element). Ich bin überrascht, wie wenige Website-Besitzer das tatsächlich tun, da es so cool und einzigartig ist. (geht über das "Aussehen" der Website hinaus und ist einfach zu machen).
Ich sollte aufhören zu reden und es selbst in die Hand nehmen!
Interessante Ideen; und wie Sie richtig bemerken, ist die Anzahl der Innovationen, die in HTML5 / Canvas Einzug halten, erstaunlich – aber ich hoffe wirklich, dass dies nicht zu einer Verbreitung von lauten Websites führt, denn eine meiner größten Abneigungen beim Surfen auf Websites ist „unaufgeforderter Lärm“.
Haben Sie Vorschläge, wie man die Töne stoppt, wenn die Maus den Hover über das Element beendet? Die Soundbites, die ich verwende, sind 5 Sekunden lang und es wird ziemlich verrückt, wenn der Benutzer versehentlich über mehrere Elemente hovers, lol.
Ich habe versucht, diesen Code zu verwenden, aber ohne Erfolg
`webkitAudioContext.prototype.stopSound = function() {
if (source) {
source.noteOff(0);
}
}`
`$(“#button1”).mouseleave(function() {
context.stopSound(‘voice1’);
});`
`$(“#button2”).mouseleave(function() {
context.stopSound(‘voice2’);
});`
Irgendwelche Ideen?
Hallo Mel, schön zu sehen, dass Sie über den Tellerrand dieser neuen Technologie hinausschauen. Als ich das Framework ursprünglich entworfen habe, hatte ich eine Sache im Sinn: viele Töne gleichzeitig abzuspielen und sie bei Bedarf überlappen zu lassen (friedlich in den Hintergrund widerhallend, bevor sie schließlich /dev/null, ihren Ursprung, erreichen). Das beinhaltete das schnelle Abspalten neuer Töne, ohne sie in einem Array oder etwas Ähnlichem zu speichern, so dass es im aktuellen Hauptzweig nicht so einfach gewesen wäre, eine stop()-Methode zu programmieren.
Glücklicherweise ist der Code noch frisch in meinem Kopf, also habe ich einen neuen Branch auf GitHub gestartet, wo ich den Code teste, der das Abspielen von Tönen einzeln, nacheinander, ohne Überlappung desselben Tones ermöglicht.
Es ist schon spät in der Nacht, aber schauen Sie sich den "stop-sound-effects"-Branch an. Der Code und die Demo dort sollten es Ihnen ermöglichen, .stopSound() problemlos zu verwenden, und sie sind so konfiguriert, dass sie keine Töne überlappen lassen, dank einer neuen Syntax, die im Hintergrund verwendet wird.
initializeNewWebAudioContext({ “enableIE”:false, “oneSoundAtATime”:true})
Lassen Sie mich wissen, ob es für das, was Sie im Sinn hatten, gut funktioniert. Es könnte noch fehlerhaft sein, es ist schon etwas spät für mich.
Danke Jungs, ich werde mir diese Links ansehen.
Sehr nützlich! Danke.