Embed-Source kann nicht abgespielt werden
Imiglykos
- javascript
0 Gernot Back0 Gernot Back0 Frodo0 Gernot Back
Hallo,
ich habe ein einfaches Skript mit einem EMBED-Tag, welches eine WAV-Datei als Quelle hat. Diese Sounddatei soll nun ganz einfach über JavaScript ausgeführt werden. Aber nichts funktioniert, was ich brauche. Ich suche die Möglichkeit in einem Chat Klänge wiederzugeben. Ich lade mehrere EMBED-Sourcen in einem seperaten Frame und möchte diese gerne von einem anderen Frame aus, dem Chat-Frame, abspielen. Natürlich habe ich das erstmal auf einfachstem Wege versucht zu realisieren:
<embed src="online.wav" hidden="true" autostart="false" loop="false" mastersound name="online">
<script type="text/javascript"><!--
document.online.play();
--></script>
Aber nichts geht. Die Sounddatei wird nicht abgespielt. Ich versuche so wenig Resourcen wie möglich zu verbrauchen. Wenn ich nämlich in jeder Zeile, die ein Klang erzeugen soll, jedesmal ein EMBED-Tag mit einem autostart="true" ausgeben würde, wäre das programmiertechnisch irgendwie ziemlich schlecht gelöst. Besser wäre die Methode, dass mehrere EMBED-Tags in einem seperatem Frame vorgeladen werden - dieses Frame würde sich halt nicht so oft aktualisieren, und per JavaScript würden dann die benötigten Sounddateien nacheinander abgespielt.
Oder seht ihr dort keinen Vorteil durch diese Method und es ist egal, ob ich jetzt mit JavaScript diese Methode erreiche oder jedesmal ein EMBED-Tag ausgebe - die Sounddatei wäre dann sowieso im Cache. Der Chat läuft mit persistenter Verbindung - also läd sich nicht immer neu.
Was meint ihr dazu? Bzw. warum funktioniert das obengenannte Skript eigentlich nicht und nur wenn ich eine onload-Methode einbau im Body oder nur wenn ich ein Button mit onclick-Methode einbaue?!?!
Schöne Grüße
Imiglykos
Hallo Imiglykos,
also so funktioniert das, meines Wissens, aber auch nur im Internet-Explorer ab Version 6.
<script type="text/javascript">
<!--
function starten () {
document.embeds['online'].play();
// alternativ kannst du auch versuchen:
// document.getElementsByTagName('embed')['online'].play();
// document.getElementByID('online').play(); wenn du unten im Embed-Element eine ID='online' vergibst.
}
-->
</script>
<embed hidden="true" src="online.wav" autostart="false" loop="false" type="video/quicktime" name="online">
<a href="Javascript:starten()">start</a>
Wichtig ist, den Mime-Typen mit anzugeben:
http://de.selfhtml.org/diverses/mimetypen.htm
In Frage kommen da "audio/x-wav" aber auch wie oben zu sehen "video/quicktime", das die meisten ja doch auf ihrem Rechner installiert haben.
Dann wird das Plugin von allen Browsern geladen (falls nicht kann man es dann herunterladen) und wird bei "autostart='true'" auch gleich abgespielt. Das siehst du auf:
Gegen den Zugriff mit JavaScript sperren sich die Plugins in den meisten Browsern - bei mir reagiert es nur im Internet-Explorer(6).
Du kannst es aber mit einem Java-Applet oder einem Flash-Plugin versuchen. Bei beidem müsstest du aber das LiveConnect regeln, wenn du es mit Javascript starten willst.
Vergleiche dazu im JavaScript-Workshop von Addison-Wesley das Kapitel zu LiveConnect für Applets:
oder den folgenden Feature-Artikel zu LiveConnect zwischen JS und AS
http://aktuell.de.selfhtml.org/artikel/programmiertechnik/liveconnect/index.htm
Du kannst natürlich auch die ganze Seite gleich mit Flash machen, das ist vielleicht einfacher.
Gruß Gernot
Hallo nochmal Imiglykos,
Ich sehe gerade, dein ursprünglicher Ansatz mit
document.online.play();
funktioniert im IE6 auch, aber eben auch nur da.
Gruß Gernot
Hallo !
Die Javascript Konsole meldet : Das Objekt unterstützt diese Eigenschaft oder Methode nicht ! Was auch nicht verwundert, da play()in Javascript garnicht existiert, wohl aber beim MS propritären JScript !! Daß z.B. folgender Code :
<embed src="irgendwas.mp3" hidden="true" autostart="false" loop="false" name="online">
<a href="javascript:document.online.play()">link</a>
im MSIE funktioniert, zeigt eigentlich nur, wie fehlerhaft programmiert bzw flexibel der Explorer ist ... wie man's halt nimmt ! ;o))
Gruß Frodo
Hallo Frodo,
es hat mir ja selbst keine Ruhe gelassen und ich habe mich mal auf den Quicktime-Seiten umgetan:
http://developer.apple.com/documentation/QuickTime/REF/QT41_HTML/QT41WhatsNew-80.html
Und so funktioniert das dann sogar auch in Opera über das Embed-Element. Allerdings hält sich Opera (7.11) nicht an autoplay="false" und spielt das Teil erst einmal ab, lässt sich dann aber über JS neu starten. In dem JavaScript ist Play() (es funktioniert groß-oder kleingeschrieben) dann natürlich eine Quicktime-Methode.
script type="text/javascript">
<!--
function starten () {
document.online.play();
}
-->
</script>
<OBJECT classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab" width="180" height="160" id="online">
<PARAM name="src" value="online.wav">
<PARAM name="autoplay" value="false">
<EMBED width="180" height="160" autoplay="false" src="online.wav" name="online" pluginspage="http://www.apple.com/quicktime/download" enablejavascript="true">
</EMBED>
</OBJECT>
Was sagst du jetzt? Bei Mozilla geht es so allerdings nicht, möglicherweise aber wenn man das Plugin anders anspricht. Mozillas Derivate habe ich noch nicht getestet.
Gruß Gernot
Hui, vielen Dank für Deine ausführlichen Antworten, Gernot!
Mmmh, allerdings habe ich so etwas ähnliches auch ausprobiert, also mit einem Start-Link, aber das ist auch nicht Sinn und Zweck der Sache - ging auch mit den meisten Browsern - allerdings funktioniert mein Skript heute nicht mehr, wo Du's jetzt anspricht, dass es nur beim IE gehen soll...auf der folgenden Seite hatte ich gestern eine Lösung für den IE und den Mozilla gefunden:
http://www.infos24.de/javascripte/handbuch/31_js_sound.htm (letzter Abschnitt mit den drei Schaltern)
Das ging bei mir gestern mit jedem Browser tadellos! Nur heute nicht. Bin ich jetzt total verblödet oder funktioniert das bei Euch auch nicht? Da steht ja auch noch extra, dass es mit dem Mozilla und IE funktioniert. Dieses simple Beispiel habe ich dann genommen und so geändert, dass der Befehl "play()" direkt ausgeführt wird, also ohne autoplay im EMBED-Tag und irgendeiner Benutzereingaben. Ich dachte, dass es kein Problem wäre, weil der eigentliche Befehl nur in einer Funktion stand und mit onClick ausgeführt wurde. Nur tat sich gar nichts. Habe ich wieder einen Link erstellt, funktionierte es. Warum? Ich sehe keinen Unterschied, ob ich den Befehl nun direkt aufrufe oder in einem onclick-Event oder halt beim onload-Event einsetze. Denn wenn das funktioniert hätte, hätte ich diese EMBED-Sourcen in ein seperates Frame geladen und von einem anderen Frame die jeweilige Sounddatei ausgeführt. Vorteil wäre auch noch, dass man die Sounds in einem Chat-Verlauf etwas zeitversetzt abspielen könnte usw.
Schöne Grüße
Imi.
Hallo Imi,
http://www.infos24.de/javascripte/handbuch/31_js_sound.htm
Das ist ein interessanter Ansatz, den kannte ich noch nicht. Er ist ja auch etwas getrickst. Danke für den Hinweis.
Das Problem mit Mozilla und seinen Derivaten Firefox und Netscape 6/7 ist, dass sie je nachdem, über was für Plugins sie verfügen, und das ändert sich ja auch mit der Nutzungsgeschichte, mitgeteilt bekommen wollen, was für ein Plugin sie denn jetzt nehmen sollen (also Mime-Type). Deshalb kann es sein, dass sie, solange sie nur wenige Plugins haben, das noch selbst erkennen, morgen aber, wenn du ein Plugin mehr installiert hast, schon nicht mehr. Deshalb gib ihnen einfach immer den Mime-Type.
Und so funktioniert das auch mit dem Ansatz des obigen Links, ich habe es ein wenig abgeändert:
<script language="javascript">
<!--
function stoppen() {
document.getElementById("toene3").innerHTML="";
}
function spielen() {
document.getElementById("toene3").innerHTML="<embed type='video/quicktime' src='loops/driveloop.wav' loop='false' autostart='true' hidden='true'></embed>";
}
-->
</script>
<span id="toene3"></span>
<a onMouseOver="spielen()" href="javascript:spielen()">spielen</a>
<a onMouseOver="stoppen()" href="javascript:stoppen()">stoppen</a>
Mit Opera funktioniert das aber nicht. Das Problem bei diesem Ansatz ist überhaupt, dass das Plugin mit innerHTML beim Stoppen immer ganz aus dem Quellcode entfernt wird und dann beim Starten wieder neu geladen werden muss. Für schnelle Meldegeräusche bei einem Chat ist das also nichts. Aber man kann doch Chats inzwischen komplett mit Flash basteln, das ist viel eleganter. Ich weiß aber auch nicht, ob dafür meine Flash-Kenntnisse ausreichen würden.
Gruß Gernot
Vielen Dank für Deine Mühen!
Deshalb kann es sein, dass sie, solange sie nur wenige Plugins
haben, das noch selbst erkennen, morgen aber, wenn du ein Plugin
mehr installiert hast, schon nicht mehr. Deshalb gib ihnen
einfach immer den Mime-Type.
Klingt auch einleuchtend.
document.getElementById("toene3").innerHTML="<embed
type='video/quicktime' src='loops/driveloop.wav'
loop='false' autostart='true' hidden='true'></embed>";
Diese Lösung, dass man von einem anderen Frame aus ein innerHTML realisieren könnte, daran habe ich eigentlich gar nicht gedacht. Mir erst jetzt so aufgefallen. Ist eigentlich eine recht banale Lösung, irgendwie. Naja, ich versuche mal mein Glück. Ich schicke Dir 'ne Mail, wenn ich's geschafft habe es umzusetzen - mit Link zum Chat. ;-) Ist 'nen etwas anderer Chat.
Für schnelle Meldegeräusche bei einem Chat ist das also nichts.
Die Ausführung der Klänge im Chat sind auch nicht häufig, oder sollten es zumindest nicht sein. Nur für besondere Ereignisse vielleicht.
Aber man kann doch Chats inzwischen komplett mit Flash basteln,
das ist viel eleganter.
Mit Flash bin ich nicht so angefreundet. Bietet allerdings trotzdem sehr gute Möglichkeiten. Mit dem Chat bin ich aber auch schon so weit, dass ein Ausweichen gar nicht mehr zu denken ist. Ich habe mein Chat komplett in PHP geschrieben als Stream-Ausgabe, weil ein Mischmasch mir nicht immer so gefällt. PHP/JavaScript ist ja schon ein Mischmasch. Mit Flash müsste man vielleicht dann mit JavaScript-Teilen nachhelfen. Also ein PHP/JavaScript/Flash-Mischmasch. Aber so gut kenne ich mich in Flash nicht aus, was es da genau für Möglichkeiten gäbe. Bin mit meiner Lösung aber vollstens zufrieden. Die Chatter auch. ;-)
Viele Grüße
Imi.
Hallo nochmal,
ich hab' das Beispiel von Dir mal ausprobiert. Mit dem Opera funktioniert das aber auch, also überraschenderweise mit allen aktuellen Browsern (oh, Wunder). :-D Nur jetzt kommt wieder das merkwürdige: Stelle ich Dein Skript so um, dass es keiner Benutzereingabe bedarf, also nicht auf "Spielen"-Link zeigen, dann kommt nix - Halt! Beim Opera funktioniert die Methode...Internet Explorer und Mozilla spucken keine Töne, wenn ich die EMBED-Source direkt in den SPAN-Tag per innerHTML einfüge...Nur durch eine Benutzereingabe...Ich kapiere es langsam nicht mehr. Aber eigentlich hatte es gehen müssen, da ja jetzt eine EMBED-Source per autostart="true" eingefügt wurde!!!
Vielleicht ist es auch - guckt auf die Uhr - zu spät, um das noch irgendwie zu begreifen. Bestimmt wird das Skript morgen, bzw. heute, mit allen Browser nicht mehr funktionieren.
Gruß Imi.
<script type="text/javascript"><!--
function spielen() {
document.getElementById("toene3").innerHTML = "<embed type='audio/x-wav' src='online.wav' loop='false' autostart='true' width='0' height='0' mastersound hidden='true'></embed>";
}
--></script>
<span id="toene3"></span>
<span onclick="spielen();" id="sound7">spielen</span>
<script type="text/javascript"><!--
document.getElementById("toene3").innerHTML = "<embed type='audio/x-wav' src='online.wav' loop='false' autostart='true' width='0' height='0' mastersound hidden='true'></embed>";
--></script>
Hi Gernot!
Mit diesem Skript wird endlich bei allen Browsern die Sounddatei abgespielt - auch ohne irgendeiner vorherigen Benutzereingabe, die natürlich auch funktioniert in diesem Skript. Jetzt kommt die Umsetzung für den Chat, wo die Sounddatei über ein anderes Frame abgespielt werden soll mit "parent.framename.document.getElementById['elementname']".
Schöne Grüße
Imi.
Hallo Imi!
Ich habe mir den Code mal kopiert und werde es demnächst mal ausprobieren.
type='audio/x-wav'
Damit habe ich allerdings bei manchen Browsern schon Probleme gehabt.
Gruß Gernot
Hi, Gernot!
Wie gesagt, die Situation ist alles andere als befriedigend !
Dies war mein Ansatz, der wie gesagt nur im MSIE klappt und eigentlich eine eigenmächtige Microsoft Javascript-Erweiterung darstellt:
<html><head><title></title>
<style type="text/css">
embed { position:absolute;top:-100px; }
</style>
<script type="text/javascript">
function music (x)
{ window.document.embeds[x].play(); }
function stopmusic ()
{ window.document.embeds[0].stop();
window.document.embeds[1].stop();
window.document.embeds[2].stop(); }
</script>
</head><body>
<embed src="wlds.mp3" hidden="true" autostart="false" loop="false" name="wlds">
<embed src="agsm.mp3" hidden="true" autostart="false" loop="false" name="agsm">
<embed src="wabf.mp3" hidden="true" autostart="false" loop="false" name="wabf">
<a href="javascript:music (0)">link</a><br>
<a href="javascript:music (1)">link</a><br>
<a href="javascript:music (2)">link</a><p>
<a href="javascript:stopmusic ()">stop</a>
</body></html>
Gruß Frodo