YouTube selbst gebaut – Teil 2

Heute wollen wir wie im ersten Teil versprochen, Flash Videos selbst basteln. Da ich weder Flash besitze noch jemand die Güte hatte, mir eine aktuelle Version zu schenken, bleibt mir nur der Weg über PHP, indem ich dort ein Flash File schreibe. Also beschwert euch nicht! Dass das geht beweist die MING Library und sieht wie folgt aus:

setDimension(480, 360);
$movie->Background(0,0,0);

Was wir hier gemacht haben ist simpel: Wir haben ein leeres Flash-Objekt instanziert und ihm seine Hintergrundfarbe und Größe zugewiesen – in unserem Fall 480×360 Pixel. Damit ist nun der Grundstock da, auf dem wir aufbauen können. Dazu binden wir ein Stream-Objekt ein und positionieren es im Feld. Kreativerweise nennen wir es einfach ‚video‘:

$stream = new SWFVideoStream();
$stream->setDimension(480, 350);
$item = $movie->add($stream);
$item->moveTo(5, 5);
$item->setname("video");

Damit ist einmal der Grundstein gelegt und wir können das Video selbst – unser flv File – einbinden. Im Prinzip geht das durch ein paar Zeilen ActionScript die wie folgt aussehen:


connection = new NetConnection();
connection.connect(null);
stream = new NetStream(connection);
video.attachVideo(stream);
stream.setBufferTime(10);
stream.play('http://ourhost/mystream.flv');

Um dem Zeug in PHP Herr zu werden, machen wir es uns einfach und binden den Code statisch ein, da es sich in unserem Fall ja nur um ein Demo handelt. Dazu verpacke ich die obrigen Zeilen in einer Variable genannt $action_string und füge sie in unser Script ein:

$action = new SWFAction($action_string);
$movie->add($action);

Doch was ist ein Player ohne die zugehörigen Knöpfchen zum rumdrücken? Wir Männer brauchen sowas. Also noch kurz ein paar Grafiken zusammenzimmern und als DBL Datei ablegen oder schlichtweg das png2dbl-Tool von Ming benutzen. Eingebunden wird das Ganze dann wieder in der guten alten PHP Manie:

$button = new SWFButton();
$flags = (SWFBUTTON_UP | SWFBUTTON_HIT | SWFBUTTON_OVER | SWFBUTTON_DOWN);
$button->addShape(ImageShape("images/pause.dbl"), $flags);
$action = new SWFAction("stream.pause();");
$button->addAction($action, SWFBUTTON_MOUSEDOWN);
$button_ref = $movie->add($button);
$button_ref->moveTo($x, $y);

Das war der einfachere Teil und ja, ihr habt Recht – es fehlt der obligatorische Fortschrittsbalken. Da ich aber keine Lust habe diesen extra zu malen, machen wir das nun ganz einfach mit PHP:

$mc = new SWFSprite();
$shape = new SWFShape();
$shape->setLine(4,25,0,0,128);
$shape->movePenTo(0, 5);
$shape->drawLineTo(0, 10);
$mc->add($shape);
$mc->nextFrame();
$slider = $movie->add($mc);
$slider->moveTo($xMin, $y);

Und damit das Ding auch noch wandert, geben wir ihm folgenden Code mit:

$a = new SWFAction("startDrag(this, $xMin, $y, $xMax, $y, 1); drag = true;");
$slider->addAction($a, SWFACTION_MOUSEDOWN);
$a = new SWFAction("stopDrag(); drag=flase;");
$slider->addAction($a, SWFACTION_MOUSEUP);

Aber so ganz einfach ist das Ganze dann auch wieder nicht, da wir uns ja durch das Herumziehen eigentlich ein Bewegen im Film erwarten. Aber auch da kann geholfen werden:

// width in px
width = xMax - xMin;

paused = false;
if(drag) {
// pause stream while seeking
_global.stream.pause(true);
paused = true;
x = _root._xmouse - xMin;
seekTo = (_global.streamLen / width) * x;
_global.stream.seek(seekTo);
} else {
pos = (_global.stream.time * (width / _global.streamLen)) + xMin;
this._x = pos;
this._y = y;
}

// restart paused stream
if(paused) {
_global.stream.pause(false);
}

Und dann war’s das eigentlich auch schon. Wir schließen den Frame ab und schreiben einfach ein kleines Flash File. Alternativ könnte man es auch direkt das PHP File ein Flash Objekt zum Client senden lassen, aber da ich ja ohnehin nur die statische Adresse zum FLV File drin habe, wäre das doch zu viel des Guten.

$movie->nextFrame();
$movie->save("FLVPlayer.swf");

Fazit: Die ganze Magie hinter Video-Portalen ist eigentlich eine ganz simple Programmierung, welche sich in wenigen Zeilen realisieren lässt.

Author:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert