{"id":826,"date":"2008-08-21T08:54:38","date_gmt":"2008-08-21T06:54:38","guid":{"rendered":"http:\/\/my.stargazer.at\/?p=826"},"modified":"2008-08-21T08:54:38","modified_gmt":"2008-08-21T06:54:38","slug":"youtube-selfmade-part-2","status":"publish","type":"post","link":"https:\/\/my.stargazer.at\/de\/2008\/08\/21\/youtube-selfmade-part-2\/","title":{"rendered":"YouTube selbst gebaut &#8211; Teil 2"},"content":{"rendered":"<p>Heute wollen wir wie im <a href=\"http:\/\/my.stargazer.at\/2008\/08\/20\/youtube-selfmade-part-1\/\">ersten Teil<\/a> versprochen, Flash Videos selbst basteln. Da ich weder Flash besitze noch jemand die G\u00fcte hatte, mir eine aktuelle Version zu schenken, bleibt mir nur der Weg \u00fcber PHP, indem ich dort ein Flash File schreibe. Also beschwert euch nicht! Dass das geht beweist die MING Library und sieht wie folgt aus:<\/p>\n<blockquote><p><code><?php\nming_useswfversion(7);\n$movie=new SWFMovie(7);\n$movie->setDimension(480, 360);<br \/>\n$movie->Background(0,0,0);<\/code><\/p><\/blockquote>\n<p><!--more-->Was wir hier gemacht haben ist simpel: Wir haben ein leeres Flash-Objekt instanziert und ihm seine Hintergrundfarbe und Gr\u00f6\u00dfe zugewiesen &#8211; in unserem Fall 480&#215;360 Pixel. Damit ist nun der Grundstock da, auf dem wir aufbauen k\u00f6nnen. Dazu binden wir ein Stream-Objekt ein und positionieren es im Feld. Kreativerweise nennen wir es einfach &#8218;video&#8216;:<\/p>\n<blockquote><p><code>$stream = new SWFVideoStream();<br \/>\n$stream->setDimension(480, 350);<br \/>\n$item = $movie->add($stream);<br \/>\n$item->moveTo(5, 5);<br \/>\n$item->setname(\"video\");<\/code><\/p><\/blockquote>\n<p>Damit ist einmal der Grundstein gelegt und wir k\u00f6nnen das Video selbst &#8211; unser flv File &#8211; einbinden. Im Prinzip geht das durch ein paar Zeilen ActionScript die wie folgt aussehen:<\/p>\n<blockquote><p><code><br \/>\nconnection = new NetConnection();<br \/>\nconnection.connect(null);<br \/>\nstream = new NetStream(connection);<br \/>\nvideo.attachVideo(stream);<br \/>\nstream.setBufferTime(10);<br \/>\nstream.play('http:\/\/ourhost\/mystream.flv');<br \/>\n<\/code><\/p><\/blockquote>\n<p>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\u00fcge sie in unser Script ein:<\/p>\n<blockquote><p><code>$action = new SWFAction($action_string);<br \/>\n$movie->add($action);<\/code><\/p><\/blockquote>\n<p>Doch was ist ein Player ohne die zugeh\u00f6rigen Kn\u00f6pfchen zum rumdr\u00fccken? Wir M\u00e4nner 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:<\/p>\n<blockquote><p><code>$button = new SWFButton();<br \/>\n$flags = (SWFBUTTON_UP | SWFBUTTON_HIT | SWFBUTTON_OVER | SWFBUTTON_DOWN);<br \/>\n$button->addShape(ImageShape(\"images\/pause.dbl\"), $flags);<br \/>\n$action = new SWFAction(\"stream.pause();\");<br \/>\n$button->addAction($action, SWFBUTTON_MOUSEDOWN);<br \/>\n$button_ref = $movie->add($button);<br \/>\n$button_ref->moveTo($x, $y);<\/code><\/p><\/blockquote>\n<p>Das war der einfachere Teil und ja, ihr habt Recht &#8211; es fehlt der obligatorische Fortschrittsbalken. Da ich aber keine Lust habe diesen extra zu malen, machen wir das nun ganz einfach mit PHP:<\/p>\n<blockquote><p><code>$mc = new SWFSprite();<br \/>\n$shape = new SWFShape();<br \/>\n$shape->setLine(4,25,0,0,128);<br \/>\n$shape->movePenTo(0, 5);<br \/>\n$shape->drawLineTo(0, 10);<br \/>\n$mc->add($shape);<br \/>\n$mc->nextFrame();<br \/>\n$slider = $movie->add($mc);<br \/>\n$slider->moveTo($xMin, $y);<br \/>\n<\/code><\/p><\/blockquote>\n<p>Und damit das Ding auch noch wandert, geben wir ihm folgenden Code mit:<\/p>\n<blockquote><p><code>$a = new SWFAction(\"startDrag(this, $xMin, $y, $xMax, $y, 1); drag = true;\");<br \/>\n$slider->addAction($a, SWFACTION_MOUSEDOWN);<br \/>\n$a = new SWFAction(\"stopDrag(); drag=flase;\");<br \/>\n$slider->addAction($a, SWFACTION_MOUSEUP);<\/code><\/p><\/blockquote>\n<p>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:<\/p>\n<blockquote><p><code>\/\/ width in px<br \/>\nwidth = xMax - xMin;<\/p>\n<p>paused = false;<br \/>\nif(drag) {<br \/>\n    \/\/ pause stream while seeking<br \/>\n    _global.stream.pause(true);<br \/>\n     paused = true;<br \/>\n     x = _root._xmouse - xMin;<br \/>\n     seekTo = (_global.streamLen \/ width) * x;<br \/>\n     _global.stream.seek(seekTo);<br \/>\n} else {<br \/>\n     pos = (_global.stream.time * (width \/ _global.streamLen)) + xMin;<br \/>\n     this._x = pos;<br \/>\n     this._y = y;<br \/>\n}<\/p>\n<p>\/\/ restart paused stream<br \/>\nif(paused) {<br \/>\n      _global.stream.pause(false);<br \/>\n}<\/code><\/p><\/blockquote>\n<p>Und dann war&#8217;s das eigentlich auch schon. Wir schlie\u00dfen den Frame ab und schreiben einfach ein kleines Flash File. Alternativ k\u00f6nnte 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\u00e4re das doch zu viel des Guten.<\/p>\n<blockquote><p><code>$movie->nextFrame();<br \/>\n$movie->save(\"FLVPlayer.swf\");<\/code><\/p><\/blockquote>\n<p>Fazit: Die ganze Magie hinter Video-Portalen ist eigentlich eine ganz simple Programmierung, welche sich in wenigen Zeilen realisieren l\u00e4sst.<\/p>","protected":false},"excerpt":{"rendered":"<p>Heute wollen wir wie im ersten Teil versprochen, Flash Videos selbst basteln. Da ich weder Flash besitze noch jemand die G\u00fcte hatte, mir eine aktuelle Version zu schenken, bleibt mir nur der Weg \u00fcber PHP, indem ich dort ein Flash File schreibe. Also beschwert euch nicht! Dass das geht beweist die MING Library und sieht wie folgt aus:<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[503,496,530],"class_list":["post-826","post","type-post","status-publish","format-standard","hentry","category-it-related-stuff","tag-howto","tag-video","tag-youtube"],"_links":{"self":[{"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/posts\/826","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/comments?post=826"}],"version-history":[{"count":0,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/posts\/826\/revisions"}],"wp:attachment":[{"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/media?parent=826"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/categories?post=826"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/tags?post=826"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}