Dyne: Probleme bei der Kommunikation zwischen ActionScript und PHP

Hallo,

ich sitze im Moment an einem kleinen Flash Projekt und erkläre erst kurz den Aufbau:

Der Flash-Movie ist ein Video Player, doch die URLs der Videos, die er spielt sind geheim. Deshalb wird ihm beim Aufruf per flashvars eine Video-ID übergeben.
Der Flash-Movie soll nun ein PHP-Script nach der URL des Videos mit dieser bestimmten ID fragen und schließlich das Video abspielen.

Das PHP-Script arbeitet richtig und gibt etwas in folgender Form zurück:

&url=videos/VIDEOURL

Ich habe eine Szene im Flash-Movie und sie besitzt 2 Layer (Ebenen): Scripts und Layout.
Im ersten Keyframe (Schlüsselbild) von Scripts steht folgendes als Action:

// Movie anhalten
stop();
// Variablen holen
loadVariables("flash.php", "_root.player" ,"POST");

player ist eine Instanz von einem "MovieClip", die im ersten Keyframe  von Layout platziert ist.

Die Instanz hat folgende Aktion:

onClipEvent (data) {
 gotoAndStop("Scene 1", 2);
}

Im zweiten Keyframe habe ich einfach einmal einen Kreis eingefügt und ein stop(); damit ich seh, wenn er in das zweite Keyframe wechselt, doch tut der Film das nicht. Das PHP-Script wird auf jeden Fall ausgeführt, das habe ich überprüft, aber onClipEvent(data) wird nicht ausgelöst.

Warum nicht? Darf ich die Aktion vielleicht nicht in der Instanz, sondern nur im MovieClip selbst setzen? Hat sich ein anderer Fehler eingeschlichen?

Ich habe die PHP- und FLA-Dateien einmal hochgeladen, falls es sich jemand selbst ansehen möchte. Das Ganze ist mit FlashMX erstellt.

  1. Moin!

    Der Flash-Movie ist ein Video Player, doch die URLs der Videos, die er spielt sind geheim. Deshalb wird ihm beim Aufruf per flashvars eine Video-ID übergeben.

    Es ist ziemlich irrelevant, was du dem Server "geheimes" übergibst. Flash kann doch nur per HTTP-Protokoll mit dem Server kommunizieren - genau wie jeder andere Browser auch. Wer diese Kommunikation "mitschneidet", sieht die übermittelte URL. Und dem Server ist es vollkommen egal, ob er nun nach "www.example.org/secretmoviefile.avi" gefragt wird, oder nach "www.example.org/movieskript.php?id=23" - das Resultat ist eine ausgelieferte Filmdatei.

    Oder anders betrachtet: Wenn man nicht an die im Flashfilm gespeicherte URL rankommt, ist dein Film so oder so "gesichert". Und wenn man rankommt, ist auch deine ID überflüssig - zumindest aus Sicherheitsaspekten.

    Das PHP-Script arbeitet richtig und gibt etwas in folgender Form zurück:

    &url=videos/VIDEOURL

    Du behauptest nur, das Skript würde richtig arbeiten. Aber was ist das, was du da zurückgibst?

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Erstmal danke für deine Antwort

      Es ist ziemlich irrelevant, was du dem Server "geheimes" übergibst. Flash kann doch nur per HTTP-Protokoll mit dem Server kommunizieren - genau wie jeder andere Browser auch. Wer diese Kommunikation "mitschneidet", sieht die übermittelte URL. Und dem Server ist es vollkommen egal, ob er nun nach "www.example.org/secretmoviefile.avi" gefragt wird, oder nach "www.example.org/movieskript.php?id=23" - das Resultat ist eine ausgelieferte Filmdatei.

      »»

      Ok, vergessen wir das "geheim". Sagen wir, die URLs sollte nicht zu offensichtlich sein (also z.B. im HTML-Quellcode an den Flashfilm übergeben).

      Das PHP-Script arbeitet richtig und gibt etwas in folgender Form zurück:

      &url=videos/VIDEOURL

      Du behauptest nur, das Skript würde richtig arbeiten. Aber was ist das, was du da zurückgibst?

      Ich möchte, dass im Flashfilm eine Variable "url" mit der relativen URL des Videos verfügbar wird. Dass das PHP-Script richtig arbeitet, damit meine ich, dass wenn ich das Script "per Hand" aufrufe (und ihm eine $videoid übergebe) es die richtige relative URL in der Form url=videos/secretmovie.avi ausgibt.

      Nur kommt es nicht im Flashfilm an.. oder an der falschen Stelle?

      1. Hallo Dyne!

        Ok, vergessen wir das "geheim". Sagen wir, die URLs sollte nicht zu offensichtlich sein (also z.B. im HTML-Quellcode an den Flashfilm übergeben).

        Wovon redest du, von Flash oder von HTML? In Flash (genauer einer swf-Datei) ist die Adresse eines verlinkten Videoclip ohnehin nicht einsehbar, ohne die Datei zu decompilieren.

        Ich möchte, dass im Flashfilm eine Variable "url" mit der relativen URL des Videos verfügbar wird. Dass das PHP-Script richtig arbeitet, damit meine ich, dass wenn ich das Script "per Hand" aufrufe (und ihm eine $videoid übergebe) es die richtige relative URL in der Form url=videos/secretmovie.avi ausgibt.

        Das mag ja sein, nur nützt dir das überhaupt nichts, weil Flash schlicht kein *.avi abspielen kann.

        Nur kommt es nicht im Flashfilm an.. oder an der falschen Stelle?

        Dazu schreibe ich dir im anderen Posting noch etwas.

        Mit besten Grüssen
        Richard

        1. Hallo Dyne!

          Hallo Richard, danke für deine Antwort

          Ok, vergessen wir das "geheim". Sagen wir, die URLs sollte nicht zu offensichtlich sein (also z.B. im HTML-Quellcode an den Flashfilm übergeben).
          Wovon redest du, von Flash oder von HTML? In Flash (genauer einer swf-Datei) ist die Adresse eines verlinkten Videoclip ohnehin nicht einsehbar, ohne die Datei zu decompilieren.

          Der Pinkt ist ja, dass das Ganze dynamisch ist, sprich, dass nicht immer das gleiche Video abgespielt wird. und irgendwie muss dem Flash klargemacht werden welches Video er abspielen soll.
          Einfachste Variante wäre einfach die URL des Videos per flashvar (im HTML-Quelltext)zu übergeben, doch genau das möchte ich ja nicht, da dann dir URL sofort ersichtlich wäre. Deshalb wird eine ID übergeben, die später durch die Kommunikation mit dem PHP-Script zu der URL führt.

          Ich möchte, dass im Flashfilm eine Variable "url" mit der relativen URL des Videos verfügbar wird. Dass das PHP-Script richtig arbeitet, damit meine ich, dass wenn ich das Script "per Hand" aufrufe (und ihm eine $videoid übergebe) es die richtige relative URL in der Form url=videos/secretmovie.avi ausgibt.
          Das mag ja sein, nur nützt dir das überhaupt nichts, weil Flash schlicht kein *.avi abspielen kann.

          Dann eben .mpeg - es war nur ein Beispiel.

          Nur kommt es nicht im Flashfilm an.. oder an der falschen Stelle?
          Dazu schreibe ich dir im anderen Posting noch etwas.

          Lookin' forward to that..

          1. Hallo Dyne,

            Einfachste Variante wäre einfach die URL des Videos per flashvar (im HTML-Quelltext)zu übergeben, doch genau das möchte ich ja nicht, da dann dir URL sofort ersichtlich wäre. Deshalb wird eine ID übergeben, die später durch die Kommunikation mit dem PHP-Script zu der URL führt.

            Damit hättest du mehr oder weniger erfolgreich die Adresse des Videos dem Besucher verschwiegen, das ist korrekt.
            Allerdings gibt es eine wesentlich schlimmere Schwachstelle: Alle Videos werden von Flash via den Browser-eigenen Funktionen geladen, ergo landen sie im Cache des verwendeten Browsers. Und da reicht nur noch ein simples Kopieren & Einfügen, um an das Video heranzukommen.

            Ich möchte, dass im Flashfilm eine Variable "url" mit der relativen URL des Videos verfügbar wird. Dass das PHP-Script richtig arbeitet, damit meine ich, dass wenn ich das Script "per Hand" aufrufe (und ihm eine $videoid übergebe) es die richtige relative URL in der Form url=videos/secretmovie.avi ausgibt.
            Das mag ja sein, nur nützt dir das überhaupt nichts, weil Flash schlicht kein *.avi abspielen kann.
            Dann eben .mpeg - es war nur ein Beispiel.

            Flash kann keine Videos dynamisch laden, außer denen im FLV-Format (dem Flash-eigenen Videoformat). Oder eben anderen SWF-Dateien.

            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. Flash kann keine Videos dynamisch laden, außer denen im FLV-Format (dem Flash-eigenen Videoformat). Oder eben anderen SWF-Dateien.

              Das ist eine Information, die mir weiterhilft. Danke. In Zukunft sei angenommen die Videos lägen als SWFs auf dem Server im Ordner Videos.

              Bisher konnte mir leider immernoch niemand sagen, warum der Handler onClipEvent(data) nicht ausgeführt wurde.

              1. Hallo Dyne!

                In Zukunft sei angenommen die Videos lägen als SWFs auf dem Server im Ordner Videos.

                Wer mit Flash arbeitet, setzt dies eigentlich als selbstverständlich voraus.

                Bisher konnte mir leider immernoch niemand sagen, warum der Handler onClipEvent(data) nicht ausgeführt wurde.

                Weil onClipEvent ein Ereignis erwartet.
                Beispiel:
                onClipEvent(ereignis) {
                aktionen(); }

                Beste Grüsse
                Richard

                1. Bisher konnte mir leider immernoch niemand sagen, warum der Handler onClipEvent(data) nicht ausgeführt wurde.
                  Weil onClipEvent ein Ereignis erwartet.
                  Beispiel:
                  onClipEvent(ereignis) {
                  aktionen(); }

                  Beste Grüsse
                  Richard

                  Und "onClipEvent(data)" wird ausgeführt, wenn Daten empfangen wurden. Sollte es zumindest.

                  1. Hallo Dyne!

                    Und "onClipEvent(data)" wird ausgeführt, wenn Daten empfangen wurden. Sollte es zumindest.

                    Ich musste mich erst mal mit dieser Uraltvariante wieder vertraut machen. In Zusammenhang mit loadVariables (seit langem erstsetzt durch das praktischere LoadVars) ist data tatsächlich ein Ereignis, wenn auch nur in Zusammenhang mit onClipEvent.
                    "data - Die Aktion wird ausgeführt, wenn bei einer loadVariables() Aktion Daten empfangen werden."

                    Dabei gelten aber Einschränkungen:
                    "Die Methode loadVariables() setzt voraus, dass der Text der URL im Standard-MIME-Format vorliegt: application/x-www-form-urlencoded."

                    Wahrscheinlich empfängst du keine Daten oder nicht im richtigen Format. Mit der Klasse LoadVars klappt das jedenfalls, allerdings erzeuge ich die auszulesende txt-Datei nicht mit PHP. Dass diese Vernebelungstaktik nichts bringt, wurde dir ja schon gesagt.

                    Beste Grüsse
                    Richard

                    1. Mit der Klasse LoadVars klappt das jedenfalls, allerdings erzeuge ich die auszulesende txt-Datei nicht mit PHP.

                      Leider bin ich nicht so Fit in OOP. Wie benutze ich diese Klasse?

                      new vars = LoadVars("flash.php", "_root.player");

                      so?

                      welche eigenschaften hätte dann vars?

                      1. Hallo Dyne!

                        Mit der Klasse LoadVars klappt das jedenfalls, allerdings erzeuge ich die auszulesende txt-Datei nicht mit PHP.
                        Leider bin ich nicht so Fit in OOP. Wie benutze ich diese Klasse?
                        new vars = LoadVars("flash.php", "_root.player");
                        so?
                        welche eigenschaften hätte dann vars?

                        Etwa so:
                        var LadeObj = new LoadVars();  // erzeugt zunächst ein Objekt der Klasse
                        LadeObj.load("flash.txt");;  // wenn flash.txt im gleichen Verzeichnis wie die swf-Datei liegt
                        LadeObj.load("./videos/flash.txt");  // wenn flash.txt im Ordner videos liegt
                        LadeObj.load("http://www.emample.net/videos/flash.txt");  // absoluter Pfad

                        LoadVars kann nur Textdateien in URL-Codierung lesen (MIME-Typ application/x-www-form-urlencoded). Du musst mit PHP also eine solche flash.txt erstellen.

                        Mir ist allerdings nach wie vor nicht verständlich, warum du einen solch komplizierten Umweg gehen willst. Der Server könnte doch die ausgewählte swf-Datei direkt übermitteln und LoadVars ist dabei völlig überflüssig.

                        Beste Grüsse
                        Richard

  2. Hallo Dyne!

    Der Flash-Movie ist ein Video Player,

    Ein Flash-Movie ist ein Flash-Movie und kein Video-Player. Was meinst du damit?

    doch die URLs der Videos, die er spielt sind geheim. Deshalb wird ihm beim Aufruf per flashvars eine Video-ID übergeben.

    Und die Video-ID ist natürlich auch geheim. ;-)

    Der Flash-Movie soll nun ein PHP-Script nach der URL des Videos mit dieser bestimmten ID fragen und schließlich das Video abspielen.

    Und wie soll Flash das machen? PHP kann eine Textdatei erzeugen, die den URL als String enthält in URL-Codierung. Diesen kann Flash dann als Variable einlesen.

    Das PHP-Script arbeitet richtig und gibt etwas in folgender Form zurück:
    &url=videos/VIDEOURL

    Etwas in folgender Form ist vielleicht nicht genau genug.

    Ich habe eine Szene im Flash-Movie und sie besitzt 2 Layer (Ebenen): Scripts und Layout.

    Unerheblich für die compilierte swf-Datei.

    Im ersten Keyframe (Schlüsselbild) von Scripts steht folgendes als Action:
    // Movie anhalten
    stop();
    // Variablen holen
    loadVariables("flash.php", "_root.player" ,"POST");

    Seit Flash MX stünde dafür die geeignetere Klasse LoadVars zur Verfügung. So düfte dein Code wohl kaum funktionieren. Das allgemeine Schema wäre: loadVariables("daten.txt", ""); für die aufrufende Instanz. (POST nur, wenn der Server die Variable mit der Post schicken soll, was er mangels Briefmarken aber nicht kann.) ;-)

    Warum nicht? Darf ich die Aktion vielleicht nicht in der Instanz, sondern nur im MovieClip selbst setzen? Hat sich ein anderer Fehler eingeschlichen?

    Der Aufruf betrifft ja die Instanz. Ich denke der ganze Ansatz ist falsch.

    Ich habe die PHP- und FLA-Dateien einmal hochgeladen, falls es sich jemand selbst ansehen möchte. Das Ganze ist mit FlashMX erstellt.

    In der fla-Datei sind schlicht keine Befehle enthalten, das könnte eine Erklärung sein. ;-)

    Beste Grüsse
    Richard

  3. Hallo Dyne,

    Ich habe die PHP- und FLA-Dateien einmal hochgeladen, falls es sich jemand selbst ansehen möchte. Das Ganze ist mit FlashMX erstellt.

    Ich habe mir die FLA-Datei mal nicht angesehen (ich mag das Authoring-Tool "Adobe Flash" nicht), aber besser wäre es, wenn du das seit Flash MX vorhandene LoadVars-Objekt einsetzen würdest.
    Ein Beispiel zur Funktion load() steht natürlich wie immer in der Dokumentation.

    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:)