Das Format von Flash-Dateien ist kein Geheimnis. 1998 gab Macromedia die Spezifikationen frei und machte damit alternative Implementierungen von Autorensoftware für Flash möglich, die Ming-Bibliothek ist ein Beispiel dafür. Sie ist in der Lage, mit wenigen Ausnahmen standardkonforme SWF-Dateien bis einschließlich Version 6 und 7 zu erstellen. Die Bibliothek ist in C geschrieben, bietet aber Schnittstellen für die populären Skriptsprachen PHP und Perl sowie für C++ und Java.
Installation
Die Ming-Sourcen können von der Projektseite als gepacktes Tar-Archiv heruntergeladen werden[1]. Ming benötigt die Bibliotheken Libungif[2], Libpng[3] und die Programme Flex und Bison, für die Übersetzung des PHP-Moduls zusätzlich die PHP-Headerdateien.
Vor dem Kompilieren des PHP-Moduls sollte man zunächst überprüfen, ob der Befehl »php-config --includes« den Ort der PHP-Headerdateien liefert. Im Falle eines Fehlers kann dieser auch manuell über die Umgebungsvariable »PHPSRC« angegeben werden, zum Beispiel mit:
export PHPSRC=/usr/src/php-4.3
Die Befehle »make« und »make install« besorgen die Übersetzung und Installation in bekannter Weise. Folgende Zeile in der »php.ini« bindet das Modul in die PHP-Installation ein und sorgt dafür, dass es automatisch geladen wird.
extension=php_ming.so
Alternativ lädt in PHP-Skripten die Anweisung »dl("php_ming.so")« das Modul dynamisch.
Ein einfacher Film
Jeder Flash-Film beginnt damit, ein »SWFMovie«-Objekt zu erzeugen (siehe Listing 1, Zeile 3). Dieses Objekt stellt Methoden bereit, um zuerst allgemeine Filmeigenschaften zu definieren wie Hintergrundfarbe, SWF-Version und Framerate (Zeilen 4 bis 6). Sind die grundlegenden Eigenschaften definiert, fügt Zeile 12 dem ersten Frame mit der »add()«-Methode neue Elemente hinzu. Diese Methode nimmt ein SWF-Objekt als Argument und liefert ein »SWFDisplayItem« zurück, siehe Tabelle 1.
01 <?
02
03 $movie = new SWFMovie();
04 $movie->setBackground(0x0,0x00,0xff);
05 $movie->setRate(2);
06 $movie->setDimension(400,300);
07
08 $shape = new SWFShape();
09 $shape->setLine(5, 0x0, 0xff, 0x00);
10 $shape->drawLine(50,50);
11
12 $dItem = $movie->add($shape);
13 $dItem->moveTo(200,200);
14
15 $movie->nextFrame();
16 for($deg = 0; $deg < 360; $deg += 10) {
17 $dItem->rotateTo($deg);
18 $movie->nextFrame();
19 }
20
21 $movie->remove($dItem);
22 $movie->nextFrame();
23
24 header('Content-type: application/x-shockwave-flash');
25 $movie->output();
26 ?>
|
|
|
|
Objekt
|
Aufgabe
|
|
SWFShape
|
Container für primitive Grafikobjekte wie Linien, Kreise und Polygone
|
|
SWFBitmap
|
Objekt für eine Grafikdatei im DBL-, GIF- oder JPEG-Format
|
|
SWFSound
|
Objekt für eine Musikdatei im MP3-Format
|
|
SWFSoundStream
|
Enthält eine Musikdatei im MP3-Format als Stream
|
|
SWFFont
|
Repräsentant für eine Font-Datei im FDB-Format
|
|
SWFText
|
Stellt eine Zeichenkette im gegebenen Font dar
|
|
SWFVideoStream
|
Objekt zur Darstellung von Videostreams
|
|
SWFAction
|
Repräsentant für in Byte-Code kompilierten
Actionscript-Programmcode; der Konstruktor erhält den Quelltext
|
|
SWFFill
|
Repräsentant für einen Füllstil
|
|
SWFGradient
|
Erzeugt einen Farbverlauf
|
|
SWFMorph
|
Repräsentant eines fließenden Übergangs zweier Shape-Objekte
|
|
SWFButton
|
Klickbares Objekt mit Event-Modell
|
Ein »SWFDisplayItem«-Objekt repräsentiert eindeutig jenes Filmelement, das sich gerade auf der Displayliste befindet und so lange sichtbar bleibt, bis man es wieder entfernt. Wird das gleiche Element einem Film mehrfach hinzugefügt, steht dafür jedes Mal ein neues, eindeutiges Display-Item-Objekt. Die Methoden, die das Display-Item-Objekt bereitstellt, können angezeigte Filmelemente nachträglich manipulieren, etwa drehen, verschieben, verzerren und skalieren. Die Funktion »setName()« weist Elementen eindeutige Namen zu, um sie über »ActionScript« anzusprechen.
Alle Modifikationen von Display-Items laufen im Kontext eines Frame ab. Ruft das Skript die »nextFrame()«-Methode auf (Listing 1, Zeile 15), werden die Änderungen am Film wirksam und ein neuer Frame steht bereit. Der ist zunächst identisch mit dem vorigen, da sich die Displayliste durch den Vorgang nicht verändert. Sollen Filmelemente ab einem bestimmten Zeitpunkt verschwinden, muss der Programmierer sie mit der »remove()«-Methode des »SWFMovie«-Objekts entfernen (Zeile 21).
Abschließend kann der Film auf zwei Arten ausgegeben werden. Mit PHP besteht die Möglichkeit, den entsprechenden HTTP-Header zu setzen (Zeile 24) und dann den fertigen Flash-Film direkt ohne Zwischenspeichern auszugeben (Zeile 25). Alternativ schreibt die Library den Film als SWF-Datei.
Um Platz und Bandbreite zu sparen, lassen sich Flash-Filme seit SWF-Version 6 komprimieren. Die »save()«- und die »output()«-Methode verarbeiten die Kompressionsrate als optionalen Parameter. Erlaubt sind Werte von -1 (keine Kompression) bis 9 (Maximalwert). Abbildung 1 zeigt das sichtbare Ergebnis im Browser.
Abbildung 1: Das Beispiel aus Listing 1 lässt eine Linie um einen ihrer Endpunkte rotieren. Die Darstellung übernimmt hier das Flash-Plugin des Firefox-Browsers.