Gernot Back: readyState wird nur lokal gemeldet

Hallo an alle,

vor einigen Tagen hatte ich mich ja schon einmal mit demselben Anliegen an einen bestehenden Thread drangehängt:

http://forum.de.selfhtml.org/archiv/2007/2/t145948/#m947109

Ich möchte im IE auslesen, ob ein Sound geladen ist, um eine Abspiel-Fortschittsanimation zu starten. Im IE möchte ich dabei den Sound über das BGSOUND-Element (oder ersatzweise über das DYNSRC-Attribut eines IMG-Elements) abspielen, weil die beide beim nahtloosen Loopen von Sounds einfach jedem Player, den man über EMBED- oder OBJECT-Element einbindet, überlegen sind.

Der Nachteil dabei: Den Start des Sounds kann ich nicht auslesen, weil das BGSOUND-Element überhaupt kein LOAD-Event feuert und das IMG-Element nur eines, das den LOAD-Status der im SRC-Attribut, nicht aber denjenigen der über das DYNSRC-Attribut referenzierten Datei medet.

Nun macht es Microsoft im IE bei Zuweisung eines Behaviors ja auch angeblich möglich, den readyStateChange eines BGSOUND-Elements melden lassen.

Lokal funktioniert das bei mir auch, und das meinem BGSOUND-Element zugewiesene Behavior meldet im Alert auch brav gleich immer den Status "complete".

<PUBLIC:ATTACH EVENT="onreadystatechange" ONEVENT="alertReadyState()" />
<SCRIPT LANGUAGE="JScript">

  
function alertReadyState() {  
   if (event.srcElement == element) {  
      alert(element.readyState);  
   }  
}

</SCRIPT>

Online würde ich ja beim Ändern des SRC-Attributs meines BGSOUND-Elements, wenn der IE die Sounddatei noch nicht in seinem Cache hat, vorher auch nacheinander noch die anderen Meldungen wie "loading", "loaded" und "interactive" erwarten.

http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/readystate_1.asp

Das SRC-Attribut lässt sich zwar auch online ändern und es spielt dann nach kurzer Ladezeit auch der andere Sound, aber es kommt dann noch nicht einmal die Meldung "complete", die ich lokal immer erhalte.

Ich habe die Rechte für die htc-Datei sogar schon auf 755, also ausführbar für alle Nutzer geschaltet, aber auch das half nichts.

Hat jemand von euch Erfahrung mit dem ReadyState? Was nutzt er mir, wenn er nur lokal funktioniert? Läuft er möglicherweise nicht auf linux-basierten Servern?

Gruß Gernot

  1. Hallo Gernot,

    vor einigen Tagen hatte ich mich ja schon einmal mit demselben Anliegen an einen bestehenden Thread drangehängt:

    http://forum.de.selfhtml.org/archiv/2007/2/t145948/#m947109

    Um nochmal auf dein ursprüngliches Problem zurückzukommen:
    Du möchtest eine Sounddatei (einen Loop) ohne merkbare Aussetzer abspielen.

    Ich sehe das BGSOUND-Tag nur sehr ungerne, schließlich ist es ein Relikt aus den Zeiten der Browserkriege und gehört nicht hierher. Flash ist zwar nicht das Allheilmittel, aber hier vielleicht das geringere Übel.

    Nun meine Frage: Wieso nicht Flash?
    Ich kenne bereits deine Gründe, habe aber ein trifftiges Gegenargument:
    Durch eine geschickte ActionScript-Logik sollte es möglich sein, einen Loop so zu erzeugen, indem man zwei Sound-Objekte verwendet, die sich überlagern (am Besten variabel einstellbar).
    Man kann sich das so vorstellen wie ein Audio-Schnitt von zwei Audiospuren.

    Normalerweise sieht das Ganze so aus (die Größe des Symbols beschreibt die Lautstärke an dieser Stelle):
    Spur 1:   OOOOOOOOOO  OOOOOOOOOO  OOOO (und so fort)
    Spur 2:   (nicht vorhanden)

    Die Pause dazwischen kommt durch gewisse Eigenschaften der MP3 als auch durch Latenzzeiten durch das Flash Plugin.

    Eine Lösung wäre nun z. B. die folgende (die stillstehende Spur wird kurz vor dem Ende der abspielenden Spur gestartet, sodass die Latenzzeiten sich kompensieren):
    Spur 1:   OOOOOOOOOO          OOOOOO (und so fort)
    Spur 2:             OOOOOOOOOO

    Und noch eine Lösung wäre es, wenn man die erste Spur aus- und die zweite einblendet bzw. umgekehrt:
    Spur 1:   OOOOOOOOo.      .oOOOOO (und so fort)
    Spur 2:           .oOOOOOOo.

    Ich denke, dass sich auf diese Art und Weise Loops mit Flash hinbekommen lassen.

    Grüße

    Marc Reichelt || http://www.marcreichelt.de/

    --
    Linux is like a wigwam - no windows, no gates and an Apache inside!
    Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
    1. Hallo Marc,

      Um nochmal auf dein ursprüngliches Problem zurückzukommen:
      Du möchtest eine Sounddatei (einen Loop) ohne merkbare Aussetzer abspielen.

      Stimmt, ich überarbeite gerade meine Domain overandover.de, auf der es um nichts anderes gehen soll.

      Nun meine Frage: Wieso nicht Flash?

      Nach allem was ich so lese ...

      http://www.flashforum.de/forum/showthread.php?t=166246&highlight=nahtlos+loop

      http://www.sonify.org/home/feature/remixology/004_prepareloops/page2.html

      ... wird bei Flash immer geraten, Loops direkt als WAV in die Flashbibliothek zu importieren und sie dann bis zu 999 mal hintereinander abspielen zu lassen.

      Nun möchte ich aber mehrere, auch mal wechselnde Loops präsentieren und fände es lästig, für jeden zuerst einen eigenen Flashfilm zu erstellen. Auch fürchte ich, dass die MP3, die Flash beim Export aus dem 999 mal hintereinandergesetzten WAV erstellt, vom Dateiumfang her deutlich größer ist als das ursprüngliche WAV-File. Aber das wäre noch zu überprüfen.

      Im Bezug auf den von dir vorgeschlagenen Ansatz glaube ich nicht, dass der "extra space" am Anfang und am Ende einer MP3-Datei, von dem beim zweiten der beiden obigen Links die Rede ist, und der das nahtlose Loopen in Flash verhindert, bei allen MP3-Dateien gleich ist oder dass es da einen allgemeingültigen Algorithmus zu dessen Ermittlung aus anderen soundimmanenten Werten gibt. Man müsste sich also dann mühsam bei jedem Loopstück durch Trial&Error-Technik an den erforderlichen zeitliche Korrekturwert beim Umschalten zwischen den beiden Tonspuren herantasten.

      Für mein Projekt verfolge ich im Moment den alten Ansatz weiter, den ich vor zwei Jahren hier schon einmal kurz vorgestellt habe:

      Beim IE verwende ich das BGSOUND-Element, bei den übrigen Browsern das Quicktime-Plugin, weil ich davon ausgehe, dass Leute, die sich einen anderen Browser als den vorinstallierten herunterladen, in aller Regel auch versiert genug sind, im Bedarfsfall ein Plugin nachzuinstallieren.

      Mit Quicktime gibt es beim Loopen die geringsten Probleme: Da gibt es zwar grundsätzlich beim ersten Durchlauf einen kurzen Aussetzer, bei allen weiteren Durchläufen aber läuft der Loop meist rund und ich kann darüber hinaus für meine DHTML-Abspielanzeige abfragen, auf welcher Millisekunde der Loop gerade spielt.

      Nur mit dem BGSOUND-Element habe ich diesbezüglich im Moment Probleme, da ich dort wie gesagt noch nicht einmal Meldung über den Beginn oder den Ladezustand des Soundstücks erhalte.

      Ich hoffe, ab 01.03.2007 mehr von meinem Projekt zeigen zu können, wenn denn die GEMA bis dahin mit der Bearbeitung meines vor zehn Tagen gestellten Lizenzantrags nachkommt.

      Gruß Gernot

      1. Hallo Gernot,

        Nun meine Frage: Wieso nicht Flash?

        Nach allem was ich so lese ...

        http://www.flashforum.de/forum/showthread.php?t=166246&highlight=nahtlos+loop

        http://www.sonify.org/home/feature/remixology/004_prepareloops/page2.html

        ... wird bei Flash immer geraten, Loops direkt als WAV in die Flashbibliothek zu importieren und sie dann bis zu 999 mal hintereinander abspielen zu lassen.

        Auf den Seiten die du verlinkt hast wird immer die alte Lösung empfohlen - nämlich die Sounddatei so in die SWF-Datei einzubinden (als WAV), damit ein Loop über eine einfache Funktion möglich wird.
        Mein Vorschlag ist es aber, die MP3-Datei so zu lassen wie sie ist - und eine kleine ActionScript-Funktion zu erstellen, die für den Loop sorgt.
        Und nein, ich spreche nicht von einem einfachen
        sound.start(offset, loop);
        oder einem Abfangen des Events onSoundComplete - denn genau da treten ja die Latenzzeiten auf, die du verhindern möchtest.

        Nun möchte ich aber mehrere, auch mal wechselnde Loops präsentieren und fände es lästig, für jeden zuerst einen eigenen Flashfilm zu erstellen. Auch fürchte ich, dass die MP3, die Flash beim Export aus dem 999 mal hintereinandergesetzten WAV erstellt, vom Dateiumfang her deutlich größer ist als das ursprüngliche WAV-File. Aber das wäre noch zu überprüfen.

        MP3 ist üblicherweise wesentlich kleiner als WAV.
        Und bei der von mir vorgeschlagenen Methode braucht man auch keine WAV-Datei mehr direkt in die SWF-Datei einzubinden, sondern kann externe MP3-Dateien verwenden (dynamisch aus dem ActionScript-Code heraus).

        Im Bezug auf den von dir vorgeschlagenen Ansatz glaube ich nicht, dass der "extra space" am Anfang und am Ende einer MP3-Datei, von dem beim zweiten der beiden obigen Links die Rede ist, und der das nahtlose Loopen in Flash verhindert, bei allen MP3-Dateien gleich ist oder dass es da einen allgemeingültigen Algorithmus zu dessen Ermittlung aus anderen soundimmanenten Werten gibt. Man müsste sich also dann mühsam bei jedem Loopstück durch Trial&Error-Technik an den erforderlichen zeitliche Korrekturwert beim Umschalten zwischen den beiden Tonspuren herantasten.

        Ich bin mir sicher, dass man für die meisten MP3s einen gewissen Standard einstellen kann. Sollte ein MP3-Loop (aus irgendwelchen Gründen auch immer) von diesem Standard geringfügig abweichen, kann man das über einen Parameter verändern.

        Für mein Projekt verfolge ich im Moment den alten Ansatz weiter, den ich vor zwei Jahren hier schon einmal kurz vorgestellt habe:

        Beim IE verwende ich das BGSOUND-Element, bei den übrigen Browsern das Quicktime-Plugin, weil ich davon ausgehe, dass Leute, die sich einen anderen Browser als den vorinstallierten herunterladen, in aller Regel auch versiert genug sind, im Bedarfsfall ein Plugin nachzuinstallieren.

        Natürlich. Schon mal aufgefallen, dass es kein natives QuickTime-Plugin für Linux gibt?
        Und noch etwas solltest du bedenken: Wieso sollte sich der Nutzer des Browsers dafür entscheiden, den IE zu verwenden oder Quicktime zu installieren, nur um einen Loop abzuspielen?
        Üblicherweise beträgt die Besuchszeit eines Surfers auf einer Webseite nur wenige Sekunden. Die meisten Surfer werden sich nicht extra für einen Loop ein weiteres Plugin installieren - es sei denn, sie zeigen _wirklich_ Interesse an der Webseite.
        Und sind danach wahrscheinlich sogar enttäuscht, wenn ihnen dann (nach Installation des Plugins) nichts geboten wird.

        Grüße

        Marc Reichelt || http://www.marcreichelt.de/

        --
        Linux is like a wigwam - no windows, no gates and an Apache inside!
        Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
        1. Hallo Marc,

          Auf den Seiten die du verlinkt hast wird immer die alte Lösung empfohlen - nämlich die Sounddatei so in die SWF-Datei einzubinden (als WAV), damit ein Loop über eine einfache Funktion möglich wird.
          Mein Vorschlag ist es aber, die MP3-Datei so zu lassen wie sie ist - und eine kleine ActionScript-Funktion zu erstellen, die für den Loop sorgt.
          Und nein, ich spreche nicht von einem einfachen
          sound.start(offset, loop);

          Das habe ich schon verstanden, auf deine Frage hin, "warum nicht Flash" bin ich deshalb ja sowohl auf die konventionelle als auch auf deine angedachte Methode eingegangen.

          Auch fürchte ich, dass die MP3, die Flash beim Export aus dem 999 mal hintereinandergesetzten WAV erstellt, vom Dateiumfang her deutlich größer ist als das ursprüngliche WAV-File. Aber das wäre noch zu überprüfen.

          MP3 ist üblicherweise wesentlich kleiner als WAV.

          Wir reden hier von einer um das 999-Fache aufgedunsenen WAV-Datei, die anschließend in MP3 konvertiert wird, im Vergleich zu einer einfachen WAV-Datei. Aber ich möchte gar nicht ausschließen, dass die Verneunhundertneunundneunzigfachung des Dateivolumens durch die anschließende Kompression in MP3 auch wieder weitgehend wettgemacht werden kann. Aber wie gesagt, das müsste man überprüfen.

          Und bei der von mir vorgeschlagenen Methode braucht man auch keine WAV-Datei mehr direkt in die SWF-Datei einzubinden, sondern kann externe MP3-Dateien verwenden (dynamisch aus dem ActionScript-Code heraus).

          Auch das habe ich verstanden.

          Und noch etwas solltest du bedenken: Wieso sollte sich der Nutzer des Browsers dafür entscheiden, den IE zu verwenden oder Quicktime zu installieren, nur um einen Loop abzuspielen?

          Ich gehe davon aus, dass jemand der versiert genug ist, sich andere Browser zu installieren als den IE (also von Tante Erna und Onkel Fritz mal abgesehen), sich den Quicktime-Player bereits bei anderer Gelegenheit installiert hat; in aller Regel sogar unbewusst bereits tutto-completto zusammen mit dem Alternativ-Browser, den er sich runtergeladen hat.

          Und für Tante Erna und Onkel Fritz mit ihrem seit zehn Jahren nicht aktualisierten IE 4 habe ich ja dann immer noch das BGSOUND-Element.

          Gruß Gernot