28.01.2015 Views

Johan Andersson Video Caster - Uppsala universitet

Johan Andersson Video Caster - Uppsala universitet

Johan Andersson Video Caster - Uppsala universitet

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Uppsala</strong> Universitet<br />

Datavetenskapliga Programmet<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

<strong>Video</strong> <strong>Caster</strong><br />

– dynamisk videospelare i Flash<br />

Examensarbete 20 poäng<br />

HT 2005/VT 2006<br />

Handledare:<br />

Petter Bjelm<br />

Ämnesgranskare:<br />

Erik Borälv<br />

Examinator:<br />

Anders Jansson<br />

Institutionen för<br />

Informationsteknologi


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

­ 2 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

Abstract<br />

Today the market of gaming is enormous. To be a gamer has turned into a lifestyle, where<br />

the best are professionals and are playing games on Internet or LAN for a living. If you<br />

manage to reach all these gamers in some way you are guaranteed a big audience. There are<br />

a lot of advantages in having a video player on the Internet instead of showing the programs<br />

on regular TV. The most obvious one is that you can look at the shows whenever it fits you<br />

and as an owner you can deliver live shows anytime you like.<br />

This essay is done at request from EGAMES.TV, who would like to deliver videos and<br />

interviews about gaming, just like MTV delivers music to those who love music. The<br />

purpose of this essay is, therefore, to create an on demand streaming video player in Flash,<br />

which is integrated with a database. With this integration it is almost too easy to change the<br />

content and visual layout on the player since it is generated from the information in the<br />

database. The essay also discusses how the player can be used within advertisement and how<br />

it is possible to develop it further.<br />

There are a lot of possibilities in making an interactive video player, when you use such a<br />

widespread and dynamic application as Flash. If you do not want to use Flash’s own video<br />

format there is always a good idea to integrate Flash with some other player to get the<br />

interactivity possibilities. With the last version of Flash there are some great functions which<br />

enable you to easy interact with the browser. Accordingly, every player who is controlled by<br />

JavaScript can also be controlled by Flash.<br />

The final product of this essay is a video player that can play streamed video. The player is<br />

generated from a MySql database and it is, therefore, easy to create more than one player<br />

with different visual appearance and information. The player is also integrated with Windows<br />

Media Player thru JavaScript and has a lot of extra functions such as comments on a clip,<br />

subtitles and play lists. For the owner of the player it is also possible to change the<br />

advertisement and commercials that are played before and/or after a video clip.<br />

­ 3 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

­ 4 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

Innehållsförteckning:<br />

1 INLEDNING .................................................................................................................................................7<br />

2 BAKGRUND ..................................................................................................................................................9<br />

2.1 OLIKA FORMAT..........................................................................................................................................9<br />

2.1.1 Quicktime......................................................................................................................................9<br />

2.1.2 RealPlayer...................................................................................................................................10<br />

2.1.3 Windows MediaPlayer............................................................................................................10<br />

2.1.4 Macromedia Flash ...................................................................................................................11<br />

2.2 OLIKA VISNINGSALTERNATIV................................................................................................................12<br />

2.3 OLIKA VISNINGSALTERNATIV I FLASH ................................................................................................12<br />

2.4 STREAMING/PROGRESSIVE DOWNLOAD I FLASH (KODEXEMPEL) ..................................................14<br />

2.5 DATABAS­PHP­XML­FLASH VS DATABAS­PHP­FLASH...................................................................14<br />

2.6 LOADMOVIE VS LOADCLIP I FLASH .....................................................................................................16<br />

2.7 PLAYLIST..................................................................................................................................................17<br />

2.8 DATABASDESIGN ....................................................................................................................................17<br />

2.9 KODSTRUKTUR OCH EXEMPEL I FLASH................................................................................................17<br />

2.10 MÖJLIGGÖRA INTERAKTIVITET...........................................................................................................19<br />

2.11 BANNERS...............................................................................................................................................19<br />

2.11.1 clickTAG ....................................................................................................................................20<br />

2.12 SÄKERHET.............................................................................................................................................20<br />

2.12.1 Säkerhet i Flash ....................................................................................................................20<br />

2.12.2 Säkerhet i PHP.......................................................................................................................21<br />

2.12.3 Säkerhet i PHP/MYSQL.......................................................................................................22<br />

2.13 EXTERNAL INTERFACE API.................................................................................................................23<br />

2.14 LOADVARS............................................................................................................................................24<br />

2.15 LIKNANDE SPELARE .............................................................................................................................25<br />

3 RESULTAT...................................................................................................................................................27<br />

3.1 STEG 2 – FUNKTIONALITET I FLASH ................................................................................................31<br />

3.2 STEG 3 – LAYOUTEN .............................................................................................................................32<br />

3.3 STEG 4 – MER FUNKTIONALITET .........................................................................................................33<br />

3.4 BANNERS .................................................................................................................................................36<br />

3.4.1 clickTAG.......................................................................................................................................36<br />

3.5 INTEGRATION MED WINDOWS MEDIA PLAYER..................................................................................37<br />

3.6 EXTRA FUNKTIONER ...............................................................................................................................38<br />

3.6.1 Sökfunktion................................................................................................................................38<br />

3.6.2 Subtitlesfunktion .....................................................................................................................38<br />

3.6.3 Subtitle­parser .........................................................................................................................38<br />

3.6.4 Dynamiska cuepoints ............................................................................................................38<br />

4 SLUTSATS...................................................................................................................................................41<br />

5 DISKUSSION OM RESULTATET ....................................................................................................43<br />

6 REFERENSER ............................................................................................................................................44<br />

­ 5 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

­ 6 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

1 Inledning<br />

I Sverige har 90 % av hushållen en PC-spelmaskin och det såldes nästan två spel/hushåll<br />

under 2005 (MDTS [18]). Att vara en ”gamer” har blivit en livsstil., en accepterad livsstil där<br />

de bästa är professionella yrkesutövare. Världsomspännande spelturneringar med enorma<br />

prissummor lockar miljontals som vill tävla med sina data- och spelfärdigheter. Eftersom det<br />

finns proffs så finns det fans, de flesta vill bli lika duktig eller bättre än deras idol, bara i USA<br />

spelar 75 % av hushållen dataspel enligt the Esa [1]. Så spelmarknaden är gigantiskt stor och<br />

det finns inga indikationer på att den ska minska, snarare visar statistiken hos the Esa [1] att<br />

marknaden kommer att bli ännu större. Eftersom marknaden är stor så är man garanterad en<br />

publik om man har något att visa upp och där kommer min interaktiva och genererade<br />

videospelare in. Denna uppsats behandlar hur man gör en dynamisk spelare i Flash som har<br />

stora möjligheter att inte bara visa video, utan också stora reklammöjligheter vad gällande<br />

banners, samt reklamklipp före och/eller efter en videofilm. Att informationen är genererad<br />

ifrån en databas gör det lätt att ändra både utseendet och innehållet på en spelare. Först<br />

behandlar uppsatsen olika teoretiska tekniker och svårigheter som finns med detta projekt,<br />

efter det så kommer den slutgiltiga lösning samt tankegångar på hur man kan utveckla det<br />

några steg vidare i framtiden.<br />

Uppsatsen kommer inte att ta upp de delar i Flash som behandlar hur man tillexempel ritar<br />

en linje och andra simpla saker, det finns bra hjälp i Flash hjälpavsnitt eller på Flash<br />

LiveDocs [2] där man snabbt kan lära sig grunderna såsom avancerade funktioner i Flash.<br />

­ 7 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

­ 8 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

2 Bakgrund<br />

EGAMES.TV [15] vill komma ut till ”gamers” på samma sätt som MTV [14] kommer ut till<br />

dem som älskar musik. Att sända on­demand­TV där tittaren själv väljer när han/hon ska<br />

titta på programmen är ett bra alternativ för ”gamers” eftersom många av dem sitter mer<br />

vid en dator än vid en TV. Vidare så är avsaknaden av att man måste sända speciella tider<br />

bra när man vill sända live.<br />

Uppgiften består alltså av att göra en produkt i vilken man ska kunna kolla på strömmade<br />

filmklipp. Dessa filmklipp ska kunna väljas genom att klicka på tumnaglar som är genererade<br />

ifrån en databas och på det sättet blir dynamiska. Spelaren ska ha olika genres för sina<br />

filmklipp, specifika reklamannonser och bannerfunktionalitet samt att man som innehavare<br />

av spelaren ska ha möjlighet att bestämma en egen genre med tillhörande filmklipp,<br />

bakgrundsbild och färgsättning.<br />

Idag finns det en uppsjö av olika tekniker och varianter att välja på när man ska utveckla en<br />

sådan applikation. De har alla sina fördelar och nackdelar och det gäller att ha klart för sig<br />

vad det är man vill eftersträva innan man väljer tillvägagångssätt.<br />

2.1 Olika format<br />

Det finns en mängd olika klienter att spela upp video med. Alla med varierande egenskaper,<br />

ett fåtal har fler fördelar än de andra, en redogörelse för de mest kända applikationerna<br />

följer.<br />

2.1.1 Quicktime<br />

QuickTime har fördelen att det är brukbart både för Mac och också PC, på deras hemsida<br />

står det att de har 25000 som kommer in på deras downloadsida varje dag. Därmed är det<br />

inte sagt hur många som verkligen laddar hem produkten. En fördel är att QuickTime oftast<br />

­ 9 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

är integrerat med nya program som kommer ut. Enligt många filmproducerare är detta<br />

formatet som gäller medan andra inte tycker om det alls. Quicktime fungerar bra på en dator<br />

med operativsystemet Windows eller MacOS.<br />

2.1.2 RealPlayer<br />

RealPlayer har ett stort utbud av bredbands-tv som man kan få tillgänglighet till om man<br />

betalar (Real Player [4]). Detta utbud kan ju tänkas vara en möjlig utbyggnad i framtiden av<br />

spelaren. RealPlayer ser man oftast i ett eget programfönster mest för att de ska få fram sina<br />

egna reklamannonser. Den kan spela multipla filer efter varandra genom metaspråket SMIL<br />

som påminner mycket om XML. RealPlayers spelare spelar de flesta format (QuickTime<br />

inkluderat), det går att sätta nytt utseende på spelaren men den stora nackdelen är att<br />

spelaren inte har en komplett version som är gratis vilket har gjort att den populariteten den<br />

hade när den introducerades nästan helt har försvunnit. Det finns en gratisversion som de<br />

kallar för basic där man till exempel inte får lika bra kvalitet på ljudet eller videon. Vidare så<br />

beskylls Windows-versionen att vara en slags ad-aware för att den ibland låter reklam dyka<br />

upp i separata fönster (Answers [3]). Denna version har också fått dålig kritik för att om<br />

man registrerar sin gratisversion så blir man bombarderad med email. Båda dessa funktioner<br />

går dock att stänga av i programmet.<br />

2.1.3 Windows MediaPlayer<br />

Ännu en av Microsofts produkter som används brett i hela världen och som inte kommer att<br />

minska i popularitet är MediaPlayer. Eftersom de är marknadsledande inom det mesta så är<br />

detta ett säkert kort att satsa på. De nya produkter de utvecklar som till exempel Xbox360 är<br />

oftast integrerade med Microsofts andra applikationer. Med Xbox360 och MediaPlayer kan<br />

man streama musik och video till TV vilket gör att man lika gärna kan kolla på klippen med<br />

hjälp av tv. Spelaren kan också öppnas i fullskärm. MediaPlayer kan kontrolleras genom<br />

JavaScript. MediaPlayer stöds bäst av Internet Explorer men ska gå lika bra att använda i<br />

­ 10 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

Netscape 7.1 dessutom är den lätt att uppdatera vilket gör att de flesta har den senaste<br />

versionen. Nackdelen med MediaPlayer är att Microsoft ofta byter format och standarder<br />

plus att med ett annat operativsystem än Windows/IE så blir det oftast problem.<br />

2.1.4 Macromedia Flash<br />

Macromedia Flash har ett eget videoformat som de kallar flv. Man måste ha Flash som ett<br />

gränssnitt om man ska se på flvvideor. Produkten Macromedia Flash är mest spridd,<br />

nedladdad samt går att köra på nästan vilken operativsystem och i vilken webbläsare som<br />

helst. Enligt Macromedia [6] har 97,7 % av alla internetburna datorer Flash installerat. Med<br />

Flash som gränssnitt kan man göra mycket vad gällande interaktivitet med videoklippen.<br />

Nackdelen är att programmen som man utvecklar i och streamingservrarna är dyra. Det är en<br />

hög inlärningströskel och flv går inte att spela separat så man blir bunden till Flash. När<br />

FlashPlayer7 kom ut så kom det en nyhet som heter progressive download vilket innebär att<br />

man börjar kolla på klippet medan den laddar hem. Detta funkar bra om man inte har många<br />

användare men man förlorar många fördelar jämfört med en streamingserver som till<br />

exempel att man kan sända live, kolla vilket hastighet som är den ultimata för användaren,<br />

man kan byta framerate och andra konfigurationer under runtime. Flv formatet är inget<br />

format som man redigerar själva filmklippet i, det gör man med sin favorit redigerare och sen<br />

konverterar man från ett annat videoformat till flv. En sista fördel med flv är storleken på<br />

filerna, jag konverterade en mpeg till bra kvalitet i flv formatet, och filen minskade från<br />

45mB till 12.5mB. Med Flash så slipper man oroa sig om man vill utveckla produkten i<br />

framtiden. Ett exempel kan vara att man har gjort ett grafiskt gränssnitt i Flash och använder<br />

flvformatet så att man har en videospelare med standardfunktionerna som alla videospelare<br />

har. Flash har inbyggda funktioner för detta så man kan göra en sådan spelare med fem<br />

musklick. Eftersom man har kontroll över gränssnittet som spelar upp videon så kan man<br />

lägga till valfri funktionalitet, ett exempel på detta är att man kan lägga till en chat eller<br />

kommentar-area liknande en gästbok till varje klipp som spelas upp.<br />

­ 11 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

2.2 Olika visningsalternativ<br />

Med alla spelare så går det att göra en så kallad ”fast start/progressive download” med vilket<br />

menas att filen kommer i en ström till datorn vilket gör att minnet aldrig blir fullt och man<br />

kan spela upp stora videoklipp. Motsatsen till detta är att man laddar ned hela filen och sedan<br />

kollar på datorn.<br />

2.3 Olika visningsalternativ i Flash<br />

Det finns flera olika varianter för att se på video i Flash enligt Macromedia [6], nedan<br />

diskuteras dessa.<br />

Sedan Flash MX och Flash Player 6 kom ut så kan man bädda in video i sin Timeline i Flash<br />

och där sen utföra vanliga och traditionella operationer som till exempel<br />

gotoAndPlay(”frame nr”); för att gå till en speciell plats i filmen. Detta är väldigt lätt att<br />

implementera men det har många nackdelar, först och främst så får man väldigt lång<br />

laddningstid om filmen är lång eftersom Flash måste ladda in hela videon innan den kan<br />

börja spela. Om videon har en annan frames per second (fps) än vad Flash är inställt på så<br />

kommer det att låta osynkat och dessutom så får man en sämre kvalitet eftersom Flash<br />

använder sig av en codec som inte presterar lika bra kvalitet när man bäddar in video. En<br />

codec är en är en "uppackare/nedpackare" (decoder) för filmer som kan komprimera<br />

videoströmmar för att spara plats. Detta alternativ används därför sällan och de enda<br />

gångerna man ska använda detta är om man tycker att de följande metoderna är för svåra<br />

eftersom man med detta alternativ bara behöver ”klicka-dra-släppa” en videofil till tidslinjen<br />

i Flash.<br />

Ett bättre alternativ är något som kallas progressive download och med det menas att man<br />

med hjälp av ActionScript i Flash kan ladda in externa videoklipp och spela upp dem under<br />

runtime. Här laddas klippet ned till hårddisken och börjar spelas så fort den har fått nog med<br />

data. Med en bredbanduppkoppling till Internet kan man börja kolla på klippet efter några<br />

­ 12 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

sekunder. Det irriterande väntandet som i vanliga fall finns när man ska kolla på filmklipp på<br />

nätet försvinner därmed vilket är ett stort plus. Eftersom den kompilerade swffilen och<br />

flvfilen är separata så försvinner också problemet med osynkat ljud. En nackdel är att om<br />

man har ett långt videoklipp så kan man inte spola i det innan hela filmen är nedladdad till<br />

datorns cacheminne. Att den laddas ned kan vara en fördel om man går in på sidan igen<br />

medan klippet ligger kvar i minnet, men det kan också ha sin nackdel eftersom klippet kan<br />

tas ur de temporära filer som Internet-browsers använder och därmed kan de digitala<br />

rättigheterna att man inte får ta andras signerade filmer brytas. Progressiv nedladdning är ett<br />

bra alternativ om man inte har så många besökare och vill ha en billig/gratis lösning.<br />

Om man däremot vill kunna visa upp filmklippet för 100-tals användare samtidigt, ha den<br />

bästa kvaliteten och alla funktioner så är det streaming som gäller. Att streama ett videoklipp<br />

i Flash är väldigt likt i kodningen för hur man använder progressiv nedladdning. Men sedan<br />

är likheterna inte många, med streaming så öppnar man en persistent koppling mellan datorn<br />

och streamingservern där man skickar data vilket spelas upp och sedan slängs bort. Eftersom<br />

man bara behöver veta vilken data som ska skickas så kan man spola direkt i en film eller<br />

göra avancerade playlists av olika delar av olika filmer till exempel. Därmed kan man lätt göra<br />

en automatiskt visare som visar de första 10 sekunder av ett filmklipp för en<br />

förhandstittning. Vidare kan man ta reda på vilken hastighet som används och justera<br />

videons kvalitet beroende på det. En annan fördel är att man kan sända live så att alla som<br />

tittar ser samma sak (jämför live sändning i tv). Men för att kunna använda sig av<br />

streamingtekniken i Flash måste man ha Flash Communication Server installerat och om<br />

man sedan lägger till kostnaden för att ha plats på ett bra streamingnätverk försvinner detta<br />

alternativ för entusiaster som bara vill ha en bra spelare eftersom ett prisexempel kan vara att<br />

det kostar 10000kr/terabyte i månaden (Akamai [19]).<br />

­ 13 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

2.4 Streaming/Progressive download i Flash<br />

(kodexempel)<br />

Det finns egentligen två sätt att välja hur man ska se på streamad film i Flash, innan den<br />

senaste versionen av Flash kom ut så fanns det bara ett sätt och det var att köra med<br />

NetStream. Med NetStream så kontaktar man först servern man vill spela upp ifrån. Sedan<br />

fyller man den strömmen med olika videoklipp som man vill se.<br />

var connection_nc:NetConnection = new NetConnection();<br />

connection_nc.connect(null);<br />

var stream_ns:NetStream = new NetStream(connection_nc);<br />

my_video.attach<strong>Video</strong>(stream_ns);<br />

stream_ns.play("video1.flv");<br />

Med connect(null) i detta exempel menas localhost. Sedan får man möjligheten att stanna,<br />

spela, stoppa videon och så vidare genom till exempel my_video.stop();<br />

Numera finns det också en komponent som heter FLVPlayBack i och med Flash Player 8<br />

som egentligen kan ses som ett API för NetStream. Denna komponent har dock fördelen att<br />

man kan lägga in dynamiska ”actionscript” cuepoints i filmen som man sedan kan fånga upp<br />

när filmen spelas för att till exempel visa en subtitle eller byta en banner eller liknande. Detta<br />

gör att det blir otroligt dynamiskt eftersom det enda man behöver göra är att lägga till en ny<br />

cuepoint med ett nytt namn och fånga det namnet för att till exempel byta bakgrundsbild på<br />

sidan på en viss tidpunkt i en viss film.<br />

2.5 Databas­PHP­xml­Flash vs Databas­PHP­Flash<br />

Man kan anropa PHP-filer i Flash och få tag i det som PHP-filer skriver ut på standardout<br />

med till exempel denna rad:<br />

­ 14 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

echo ”exjobb”;<br />

Om man vill tilldela en variabel titel som finns i Flash något värde ifrån PHP skriver man:<br />

echo ”&title=EnTitel”;<br />

Om man sedan vill ha fler variabler fyller man på med till exempel (Sepiroth [7]):<br />

echo ”&title=Entitel&titel2=TvåTitel&titel3=osv…”;<br />

Om man gör på detta sätt och ska sätta det mesta i Flash från sin databas får man en<br />

jättelång sträng som inte kommer att vara överskådlig plus att man måste ha skrivit rätt<br />

variabelnamn för att det ska fungera. Dessutom har man dålig koll på vad variablerna heter<br />

som kommer in, man kan ju mycket väl ha döpt en variabel till title i Flash redan, beroende<br />

på när man läser in så kommer den ena variabeln att bli överskriven. En annan variant är att<br />

låta PHP göra en xmlfil som output ifrån databasen och att Flash sedan hämtar den filen för<br />

att parsa den i Flash istället. Då kan man där ta ut vad man vill och strunta i det som den inte<br />

har användning för. Alltså kan man i detta tillvägagångssätt få en mer dynamisk lösning<br />

eftersom man inte behöver sätta alla variabler som kommer in, utan man kan göra en<br />

xmlparser som sätter allt som fanns i xml dokumentet. När man använder xmlfiler som<br />

kommunikation mellan Flash och PHP så är det lätt ifall man skulle vilja byta ut Flash emot<br />

ett annat gränssnitt som till exempel en JavaApplet. I båda fallen måste man vara<br />

uppmärksam på att det är en sträng man får in. Om man har läst in till exempel<br />

&number=13 och sedan utför operationen trace(number +7); i Flash så får man 137 som<br />

resultat eftersom + operatorn kan lägga ihop en sträng med ett tal.<br />

­ 15 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

2.6 loadMovie vs loadClip i Flash<br />

För att ladda in Flashfiler eller bildfiler i Flash så har man egentligen två alternativ när man<br />

väl vet sökvägen till det som ska laddas in. Funktionen loadMovie() har fördelen att den är<br />

lättast att implementera, men den simplaste lösningen är oftast inte det ultimata inom<br />

datavärlden. Man förlorar möjligheten att undersöka när bilden har laddats klart samt att det<br />

movieclip som bilden laddas till förlorar alla sina egenskaper. Men med loadClip() går det<br />

däremot att göra just detta. Demonstrerar med följande kodutdrag från Flash­creations [8]:<br />

var loader:MovieClipLoader = new MovieClipLoader();<br />

var loadHandler:Object = new Object();<br />

loader.addListener(loadHandler);<br />

// define what should happen when the jpg/swf is completely loaded<br />

// use _mc to refer to the loaded jpg/swf<br />

loadHandler.onLoadInit = function(_mc:MovieClip) {<br />

// code here<br />

};<br />

// define what should happen while the jpg/swf is loading<br />

// use _mc to refer to the jpg/swf and loaded & total to refer to the number of bytes<br />

// currently loaded and to be loaded, respectively<br />

loadHandler.onLoadProgress = function(_mc:MovieClip, loaded:Number, total:Number) {<br />

// code here<br />

};<br />

// start loading specified jpg/swf into blank movieclip holder_mc on stage<br />

loader.loadClip("somepic.jpg", holder_mc);<br />

I och med att avseendet för spelaren var att ladda in små bilder till filmklippens tumnaglar så<br />

skulle det gott räcka med loadMovie(). Men med tanke på att man i framtiden kanske vill<br />

ladda in större bilder som till exempel en bakgrundsbild så är det ett bättre alternativ att<br />

implementera loadClip varianten.<br />

­ 16 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

2.7 Playlist<br />

En playlist görs lättast som en array där det är det första elementet i arrayen som ska spelas<br />

härnäst. Som en FIFO kö alltså (first-in-first-out), när en film har spelats klart så tittar man<br />

bara om det finns ett objekt i arrayen och spelar då upp detta. Eftersom det räcker med en<br />

sökväg för att spela upp en film så duger det att spara sökvägen som en sträng i arrayen. Det<br />

kan däremot vara smart att spara hela filmklippobjektet som har blivit inläst ifrån databasen<br />

eftersom man då får mer valmöjlighet när man ska spela upp klippet. Man kan till exempel<br />

ange om filmklippet är ett reklamklipp för att kanske dölja eventuella knappar som sköter<br />

spolning och sökning i filmen.<br />

2.8 Databasdesign<br />

Det finns en hel del att tänka på när man designar en databas. Men i detta ämne som denna<br />

uppsats handlar om så är designen inget avancerat så man kan följa med i resonemanget utan<br />

att kunna databasdesign. Om man däremot ska göra ett större system så är det en klar fördel<br />

att från grunden ha en bra databasdesign för att till exempel underlätta framtida utbyggningar<br />

av systemet.<br />

2.9 Kodstruktur och exempel i Flash<br />

Man kan liksom i de flesta språk koda på olika sätt, men i Flash är det mer märkbart<br />

eftersom det hela tiden kommer ut nya versioner av språket ActionScript samt att de som är<br />

nybörjare och mest vill hålla på med grafik men som ibland måste skriva lite kod får lära sig<br />

ett sätt som inte är lämpligt när man ska göra större projekt. Så det finns ingen standard<br />

egentligen men det finns två olika sätt att skriva för att få samma funktionalitet. Om man till<br />

exempel vill att när man klickar på ett movieclip så ska den ändra en text samt att en annan<br />

text hela tiden uppdateras beroende på var musens x-koordinat befinner sig kan man skriva<br />

såhär i själva movieclip instansen:<br />

­ 17 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

onClipEvent(mouseDown){<br />

}<br />

_root.testtext_txt.text =”Ändrade texten…”;<br />

onClipEvent(enterFrame){<br />

}<br />

_root.musx_txt.text = _root._xmouse;<br />

Eller så här i roten av tidslinjen om movieclip instansen heter test_mc:<br />

test_mc.onMouseDown=function(){<br />

_root.testtext_txt.text =”Ändrade texten…”;<br />

}<br />

test_mc.onEnterFrame=function(){<br />

_root.musx_txt.text = _root._xmouse;<br />

}<br />

Det som talar för det första alternativet är att man får den kod som tillhör själva instansen i<br />

instansen så att det är lätt att hitta den kod som hör till just det aktuella objektet eftersom det<br />

bara är att klicka med musen i den grafiska vyn för att få upp all aktuell kod. Med detta sätt<br />

så blir det lättare att förstå vad kodsnuttarna hör till men om man gör ett större projekt så<br />

blir både svårt att hitta det man söker samt svårt att ändra funktionerna. Med det andra<br />

alternativet så får man all kod i hela projektet på samma ställe och kan vara säker på att inga<br />

variabler skrivs över i ett movieclip som ligger långt in i trädstrukturen och som kanske till<br />

och med är dolt. I denna uppsats används enbart det senare alternativet.<br />

Man kan också argumentera för att använda objektorienterad programmering i Flash, det är<br />

väldigt likt Java men är inte fullt lika utvecklat. Med denna teknik så kan man på ett lätt sätt<br />

återanvända kod och ärva objekt. Om man göra stora och väldigt invecklade applikationer så<br />

är denna teknik att föredra. Det som kan tala emot den i detta fall är att det inte är en så svår<br />

applikation som ska utvecklas och att om man inte har testat på objektorienterad<br />

programmering förut så är det svårt att sätta sig in i det sättet att tänka. Eftersom<br />

EGAMES.TV hellre vill jobba med en produkt som ser ut som de känner igen så har jag valt<br />

att inte utveckla spelaren på detta sätt.<br />

­ 18 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

2.10 Möjliggöra interaktivitet<br />

Ett måste med ett dynamiskt system är att man har ett gränssnitt där man kan ändra<br />

innehållet i spelaren, en administrationssida. Denna sida ska enbart visa informationen i<br />

databasen samt ge möjlighet för en användare att lägga till, ta bort eller ändra den<br />

informationen. Eftersom det är viktigt att inte fel värden hamnar i databasen så är det viktigt<br />

att man tittar att allt är rätt innan man ändrar i databasen. Ett bra knep är att använda<br />

kryssrutor och listfönster istället för textrutor där man får skriva in ett id nummer för en<br />

speciell rad i en annan tabell. På det sättet kan användaren i alla fall inte skriva otillåtna<br />

värden eftersom alla värden som man kan välja på är riktiga. Det är också viktigt att ha ett<br />

bra hjälpavsnitt där man med exempel visar hur alla delar i systemet kan se ut.<br />

2.11 Banners<br />

För att få den bästa dynamiska bannermöjligheten så borde bannerytorna också läsas in från<br />

en databas. Om man hela tiden ser till att banners kommer under spelaren så kan man lägga<br />

”specialsydda” banners bakom spelaren. Sedan när man vill byta banner så skickar man in<br />

den nya banneradressen samt vilken position den ska ha via cuepoints.<br />

Jag har gjort så att man har tre valmöjligheter när man ska ange att en banner ska bytas ut i<br />

en film:<br />

- Man kan ange en siffra för att få ut en banner ur bannerstabellen med samma id.<br />

- Man kan skriva en text utan http:// för att leta reda på alla banners ur<br />

bannerstabellen med samma genre som texten och sedan ta en slumpvis banner ur<br />

dessa.<br />

- Man kan skriva en full länk med http://www.example.com/banner.jpg.<br />

Eftersom Flash lika gärna laddar in en bildfil som jpg eller png som en Flashfil med samma<br />

funktion så behöver man inte göra någon koll på vad som laddas in. Funktionaliteten att den<br />

tar en slumpvis banner gör att spelaren kommer att se mer flexibel ut om det inte är samma<br />

banner nästa gång man spelar upp ett klipp.<br />

­ 19 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

2.11.1 clickTAG<br />

Det finns enligt FlashBannerNow [9] en standard inom bannerannonsering och Flash som<br />

heter clickTAG. Med det menas att så fort man öppnar en länk i Flash så ska man öppna<br />

adressen som ligger i variabeln clickTAG istället för att skriva in webbadressen manuellt.<br />

Hela poängen med det är att får möjligheten att logga bannerklick och visningar om man<br />

anropar ett script som tar clickTAG adressen, loggar rätt banner i en databas och sedan<br />

skickar vidare till den ursprungliga webbadressen.<br />

2.12 Säkerhet<br />

När man jobbar med Flash som kommunicerar med PHP vilket i sin tur anropar en databas<br />

så finns det många säkerhetsaspekter att ta upp. Graden av säkerhet beror på vilken<br />

applikation man gör, en gästbok behöver inte ha samma säkerhet som en pokerklient där<br />

säkra transaktioner för alla överföringar är ett måste.<br />

2.12.1 Säkerhet i Flash<br />

I och med Flash 8 så kan man bara anropa script och liknande i sin egen domän. Tidigare<br />

visste man inte om Flash läste något från hårddisken och skickade iväg det till en server. Det<br />

går att ändra så att man kan anropa andra domäner också men man måste alltså ange det<br />

explicit via ActionScript. En klar nackdel med Flash är att det finns dekompilerare som tar<br />

en publicerad Flashfil (.swf) och gör om den till den riktiga Flashfilen (.fla) som den var<br />

innan. Detta gör att vad man än gör för säkerhetsgrejer i Flash så är det lätt för vem som<br />

helst att gå in och kolla hur man har gjort. Visserligen ska det till lite extra kunskap för att<br />

göra detta, men man måste ändå tänka på detta och inte skriva in lösenord eller dylikt i<br />

Flashen. Man kan använda sig av kodförvanskningsprogram om man vill, med ett sådant så<br />

byter man namn på alla variabler och dylikt till nästan lika och långa variabelnamn. Till<br />

exempel om man har rad i koden: var my_str:String=_root.textField.text; så kan den bytas ut<br />

­ 20 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

mot: var asdffasdfasdf:String = _root.asdfasdfffafaf.text;, och om all kod ser ut på detta sätt så är<br />

det svårt att förstå vad som händer. Om inte annat så gör man det svårare för den som vill<br />

kopiera/läsa koden.<br />

2.12.2 Säkerhet i PHP<br />

Enligt Zend [10] är det viktigt att i PHP veta varifrån de variabler man använder faktiskt<br />

kommer ifrån. Man måste verkligen garantera sig själv om att de är de rätta variabler som<br />

man faktiskt vill ha in och inte några som är satta så att de ska kunna få tag i information<br />

som inte var ämnat för dem. Om man till exempel gör ett PHP script som ska ta en sida som<br />

input som den sedan ska visa upp så att länken ser ut såhär:<br />

http://example.com/page.phpi=aboutus.html<br />

Så måste man direkt tänka på massa saker för säkerhetens skull, vad händer till<br />

exempel om man sätter i till i=../../../etc/passwd Man måste kolla att .html är med<br />

i variabeln i. Vidare måste man kolla att inte http:// eller liknande är med, annars<br />

skulle man kunna bli utsatt för något liknande detta:<br />

http://example.com/page.phpi=http://evilhacker.org/exec.html<br />

Där exec.html innehåller några rader kod:<br />

<br />

Med dessa rader så får alla i mailroten ett email i sin inpost. Vidare om man vill göra en<br />

typisk ”tell-a-friend” funktion som skickar ett email till en person som tipsar om en bra sida<br />

så ska man tänka på att dessa ofta används av spammare. Eftersom en sådan funktion oftast<br />

får alla inparametrar skickade till sig, såsom avsändare, mottagare, meddelande och så vidare<br />

så kan det vara en smart idé att göra någon form av koll innan man skickar iväg mailet. Ett<br />

­ 21 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

ganska simpelt sätt att göra detta är att ta längderna av strängarna som PHP scriptet får in<br />

och göra ett tal av dem som till exempel ((mottagare * avsändare * meddelande-22)) % 200,<br />

om man gör detta tal i Flash och skickar med det som extra parameter till sin funktion så kan<br />

man göra samma uträkning i PHP och kolla så att de stämmer överens. Med detta så måste<br />

man ändra den extra parametern till rätt tal om man skickar in godtryckliga indata. Detta gör<br />

att det i alla fall tar lite extra tid för den som inte är behörig att använda funktionen.<br />

2.12.3 Säkerhet i PHP/MYSQL<br />

En databas kopplat till PHP gör att man kan göra många dynamiska applikationer, med det<br />

blir också många säkerhetshål som uppkommer. Om man har en funktion som får in<br />

parametrar och sedan gör en fråga till databasen via dessa så måste man förvissa sig om att<br />

parametrarna innehåller rätt saker. Eller rättare sagt måste man vara säker på att de inte<br />

innehåller fel saker, till exempel om man har en fråga som bara ska uppdatera en räknare i<br />

databas:<br />

”UPDATE table SET counter=counter+1 where id=5;”<br />

Om table hade varit en inparameter så hade man lätt kunna sätta den till något liknande<br />

detta: ”users set pwd=1#” vilket gör att alla lösenord i tabellen users sätts till ”1”.<br />

Eftersom ”#” markerar att allt efter det är en kommentar så bryr sig inte MySql om<br />

det och den ursprungliga funktionen som bara skulle uppdatera en räknare har fått<br />

en helt ny innebörd. Detta sätt att förvanska en MySql fråga kallas MySql injektion och<br />

används flitigt för att få tag i information eller för att helt enkelt förstöra (MySql [11]). En<br />

funktion som är användbar och gör om en inparameter till ett riktigt uttryck följer:<br />

// makes a string safe for mysql<br />

function quote_smart($value)<br />

{<br />

// Stripslashes<br />

if (get_magic_quotes_gpc()) {<br />

­ 22 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

}<br />

}<br />

$value = stripslashes($value);<br />

// Quote if not integer<br />

if (!is_numeric($value)) {<br />

}<br />

$value = "'" . mysql_real_escape_string($value) . "'";<br />

return $value;<br />

2.13 External Interface API<br />

I och med senaste versionen av Flash (Flash 8) så kan man kommunicera med den<br />

kompilerade Flashfilen med till exempel JavaScript. Det omvända har länge fungerat<br />

eftersom man kan skriva och exekvera JavaScript i Flash. Men för att tala med Flash så<br />

använder man sig av ett API som heter External Interface. Man kan skicka godtryckligt med<br />

variabler och man kan returnera ett värde till JavaScriptet. Ett exempel på detta kan se ut<br />

såhär:<br />

import Flash.external.ExternalInterface;<br />

ExternalInterface.addCallback("testMe", null, testMeFlash);<br />

function testMeFlash() {<br />

trace(”Got a function call from external source”);<br />

ExternalInterface.call("tick_counter");<br />

}<br />

Med detta så får JavaScript tillgång till en funktion som heter testMe och som i sin tur<br />

anropar en Flash funktion som heter testMeFlash som anropar en funktion i JavaScriptet<br />

som heter tick_counter().<br />

På JavaScriptets sida så kan man ha en funktion som gör om funktionsanropet till rätt syntax<br />

beroende på vilken webbläsare man har:<br />

function thisMovie(movieName) {<br />

if (navigator.appName.indexOf("Microsoft") != ­1) {<br />

return window[movieName]<br />

­ 23 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

}<br />

}<br />

else {<br />

}<br />

return document[movieName]<br />

Sedan anropar man funktionen testMe() i Flash genom (förutsatt att identitetsnamnet för<br />

Flashfilen är ”container”):<br />

thisMovie("container").testMe();<br />

External Interface är så pass integrerat att det inte sker någon fördröjning alls, det går lika<br />

snabbt att använda JavaScript i Flash som det går att få samma resultat från en funktion i<br />

Flash.<br />

Detta interface gör att man öppnar upp för fler möjligheter med Flash. Spelaren som<br />

utvecklades i detta exjobb utnyttjar detta för att faktiskt integrera Windows Media Player<br />

som ett ytterligare format i Flash. Eftersom Windows Media Player alltid kommer över alla<br />

andra objekt i webbläsaren så kan man bädda in deras spelare på exakt den position som<br />

Flash spelaren ligger på. Sedan när man klickar på en playknapp i Flash så ser man vad det är<br />

för sorts fil som ska spelas, om det är en Windows Media Playerfil anropar man ett<br />

JavaScript som sätter igång filmen, annars kör man med Flash flvplayback komponenten.<br />

Med Windows Media Player får man fördelen att man kan köra i riktig fullscreen som inte<br />

går med Flash. Detta gör att man lika gärna kan ta ut filmklippen på tv som man kan se det<br />

på skärmen. Vidare kostar det en tiondel så mycket att fixa plats på en streamingserver med<br />

Windows Media Playerformat än Flashformat. Detta är ett bra alternativ för den som inte<br />

har råd men som ändå vill sända streamat.<br />

2.14 LoadVars<br />

För att få Flash att kommunicera med till exempel en PHPsida så finns det i något som kallas<br />

LoadVars som kan ses som att man skickar ett object till PHP sidan. Ett exempel kan vara<br />

­ 24 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

att den sidan man skickar informationen till heter test.php och att den vill ha en text som<br />

den kallar för test_text. Nedan följer hur detta ser ut i Flash ActionScript:<br />

var testLoadVars = new LoadVars();<br />

testLoadVars.test_text= _root.test_text.text;<br />

testLoadVars.sendAndLoad(”test.php", testLoadVars, 'POST');<br />

testLoadVars.onLoad = function(success) {<br />

if (success) {<br />

trace("sended ok");<br />

_root.test_text.text = testLoadVars.return_string;<br />

}<br />

Med den näst sista raden visas också hur man tar emot ett svar ifrån PHP sidan, det blir helt<br />

enkelt ett attribut till objektet LoadVars.<br />

2.15 Liknande spelare<br />

Denna genre av applikation är populär hos alla grupper som har med nyheter att göra. Än så<br />

länge är det inte så många som har tillgång till en dynamisk spelare, men som det ser ut så<br />

kommer det fler och fler hela tiden. Jag har inte hittat en liknande spelare hos de stora<br />

tidningarna utomlands men de svenska tidningarna såsom Aftonbladet och Expressen har<br />

båda en spelare som de kallar för webb-tv. Det som skiljer deras båda spelare åt är att<br />

Expressen [12] använder Windows Media Player integrerat med Flash som gränssnitt och<br />

Aftonbladet [13] använder sig av progressivt nedladdningsbara klipp i Flashformat. Min<br />

spelare klarar båda formaten och dessutom klarar den att spela Windows Media Playerklipp i<br />

Mozilla Firefox om man installerar en ActiveX komponent. En spelare som har en något<br />

annorlunda struktur än vad min har är MTVs spelare [14]. De kallar den Overdrive och<br />

förutom att den har en snygg design så fungerar deras funktioner verkligen bra. De har<br />

liksom Expressen valt att använda Windows Media Player, de får då möjligheten att visa sina<br />

videoklipp i fullskärm vilket måste vara en bra funktionalitet när man ska visa musikvideor.<br />

Nyhetsjätten CNN har en likadan lösning som Expressen fast de har integrerat spelaren mer<br />

med sin vanliga webbplats, de har med en flashversion av spelaren som bara visar de första<br />

­ 25 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

tio sekunderna av filmerna. När man sen vill se mer så klickar man så att spelaren öppnas i<br />

ett nytt fönster.<br />

Det verkar som om att just nu är det en klar majoritet som använder sig av Flash som<br />

gränssnitt men sedan Windows Media Player för att spela upp själva videon. Det har nog att<br />

göra med att man vill kombinera det bästa av två världar. Flash<strong>Video</strong> har nackdelen att det<br />

tar tid att konvertera till detta format och det går inte att köra i fullskärm när den spelas upp.<br />

Eftersom en nyhetssida har bra ruljans på videoklippen så måste det vara lätt att lägga upp<br />

nya videoklipp så att använda ett annat format än Flash<strong>Video</strong> snabbar upp den processen.<br />

Flash har i sin tur fördelen att det är lätt att göra en egen design och lägga till egen<br />

interaktivitet i spelaren.<br />

­ 26 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

3 Resultat<br />

EGAMES.TV [15] som jag har gjort examensarbetet åt ville undersöka hur man gör en<br />

interaktiv och dynamisk spelare i Flash och som har många valmöjligheter vad gäller reklam.<br />

För att beskriva spelaren och hela systemet är uppsatsen delad i flera delar, börjar från<br />

grunden med databasen, bygger sedan på med funktionaliteten och avslutar med de visuella<br />

tankebanorna.<br />

När projektet startade var databasen väldigt liten och hade bara en tabell som hette<br />

movieclips. Men man insåg snabbt att det kommer att behövas mycket mer så en bra start är<br />

att tänka ut från början vad hela spelaren ska ha för funktionalitet och göra en tabellhierarki<br />

över detta. Det är dock inte så avancerad databashantering som behövs och är ganska<br />

elementärt att räkna ut, en spelare ska ha flera videoklipp och så vidare. Om man hela tiden<br />

tänker sig att oberoende saker inte ska vara i samma tabell blir det oftast inte så mycket<br />

bekymmer med tanke på att MySql anser att en tabell på två miljoner rader är liten. Nedan<br />

följer ett sorts diagram som anger vilka tabeller som finns och vilka som har något att göra<br />

med varandra. Denna tabell kan med fördel användas i fortsättningen för att förstå hur<br />

spelaren är uppbyggd. Alla tabeller måste ha en kolumn som har unika värden och som<br />

därmed kallas för tabellens nyckel. För att sedan referera till en annan tabell så anger man<br />

den andra tabellens unika nyckel nummer. Det är så alla tabeller som har något att göra med<br />

varandra hänger ihop rent strukturmässigt (nyckeln heter id i alla tabeller).<br />

­ 27 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

[ Umldiagram över databasstrukturen ]<br />

­ 28 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

Diagrammet visar den slutgiltiga spelaren som uppsatsen kommer att beskriva mer om, i<br />

början så innehöll diagrammet bara det väsentligaste, som movieclips- och players-tabellen.<br />

Nästa steg i utvecklingen var att fundera ut hur man skulle få in informationen som nu hade<br />

sparats i databasen in till Flash. Man kan välja lite olika tekniker, främst beroende på hur<br />

mycket data som ska transporteras. Om man har jättemycket som ska överföras så ska man<br />

välja att bara överföra det som är viktigt, men i detta fall fungerar det bättre om man överför<br />

all data som finns i den raden man frågar efter i databasen och sen avgör i Flash om man vill<br />

använda allt eller inte. Detta gör att så fort man ändrar databasstrukturen så behöver man<br />

inte bekymra sig över att Flash inte har likadan information vilket underlättar framtida<br />

utbyggningar samt minskar felsökningar så jag gjorde ett PHP script som tar en databasfråga<br />

och som returnerar svaret på frågan uttryckt i XMLformat. I avsnittet ”Databas-PHP-xml-<br />

Flash vs Databas-PHP-Flash” högre upp så får man tillgång till allt som PHP skriver ut med<br />

echo; vilket gör att man också kan skriva ut en XMLfil och sedan parsa den i flash. Därför<br />

var nästa steg att göra en funktion i Flash som tog en XMLfil, parsade den och returnerade<br />

svaret som objekt i en array.<br />

//<br />

// Loads an xml file and returns all values as an array with objects.<br />

// xmlnode is the outer node to check for in path.<br />

//<br />

function loadXml(path, xmlnode) {<br />

var xmlArray:Array = new Array();<br />

var Xml:XML = new XML();<br />

Xml.onLoad = handleLoad;<br />

Xml.ignoreWhite = true;<br />

Xml.load(path);<br />

function handleLoad(status) {<br />

if (Xml.firstChild.nodeName.toString() == "error") {<br />

xmlArray.push("error");<br />

return xmlArray;<br />

}<br />

if (Xml.firstChild.nodeName == xmlnode) {<br />

for (var eNode:XMLNode = Xml.firstChild.firstChild; eNode != null; eNode = eNode.nextSibling)<br />

{<br />

­ 29 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

object = new Object();<br />

}<br />

for (var iNode:XMLNode = eNode.firstChild; iNode != null; iNode = iNode.nextSibling) {<br />

if (iNode.nodeName == "cuepoints") {<br />

if (iNode.firstChild.toString() == "1") {<br />

object.cuepoints = "1";<br />

} else {<br />

object.cuepoints = "0";<br />

}<br />

} else {<br />

object[iNode.nodeName] = iNode.firstChild;<br />

}<br />

}<br />

xmlArray.push(object);<br />

}<br />

}<br />

}<br />

xmlArray.reverse();<br />

return xmlArray;<br />

Nu är det lätt att få tag i valfri data ifrån databasen, om man till exempel vill ha alla<br />

movieclips som finns i databasen lagrade i en array skriver man bara:<br />

var query:String = "select * from movieclips";<br />

var _root.movieclips_array:Array = loadXml(dbtoxml.phpquery=" + query + "&table=movieclips",<br />

"movieclips");<br />

Sedan får man en specifik information genom att skriva arrayen efterföljt av ett index och<br />

valfritt id för ett objekt. Om man vill ha ut innehållet i databasens första rad och kolumnen<br />

med namnet genre så skriver man:<br />

_root.movieclips_array[0].genre;<br />

Hela den här biten är ganska simpel, men den är helt klart kraftfull ändå. Det är bra att tänka<br />

på att man ska ta all information man ska använda ifrån databasen direkt, dels så att man inte<br />

fastnar i tankebanor där man hårdkodar allt och sedan underlättar det eftersom man får in all<br />

information och att det inte kommer att bli fel eftersom det är något som fattas. Givetvis ska<br />

man inte lägga in hela databasen det första man gör när man laddar spelaren, en användare<br />

­ 30 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

tar hellre flera små laddningar och får därmed valmöjligheten vad han/hon vill ladda istället<br />

för att ha en lång laddning i starten av spelaren.<br />

Eftersom det nu finns en ”brygga” mellan Flash och PHP som är standardiserad genom att<br />

man använder XML så kan man se det som två olika applikationer. En i PHP och en i Flash<br />

vilket gör att det går att ändra logiken på till exempel PHPsidan så att Flashsidan ändå<br />

fungerar, den gör sitt vilken data den än får in, man kan se det som om det är PHPsidans<br />

uppgift att ge den korrekt data.<br />

3.1 Steg 2 – Funktionalitet i Flash<br />

För att få en besökare att stanna på en sajt ska man skapa så mycket interaktivitet som<br />

möjligt, samt givetvis ha ett bra innehåll. Man kan göra hur mycket som helst för att få en<br />

besökare intresserad, jag har valt att bygga funktionalitet så att man kan kommentera<br />

filmklipp, delta i olika pollningar och berätta för en vän om sidan (typisk tellafriend<br />

funktion), allt för att aktivera besökaren. Om man studerar UML-diagrammet av databasen<br />

ovan så får du en aning om hur jag har gjort, för kommentarer har skapats en egen tabell<br />

som anger vilket filmklipp det tillhör, sedan används funktionen loadXML() för att få in rätt<br />

kommentarer. En typisk fråga för att få alla kommentarer som gäller filmklipp med id=10<br />

ser ut såhär:<br />

query = "select * from comments where movieclip_id='10' order by date desc”;<br />

För att kunna skriva in kommentarer och se pollnings alternativ däremot måste man göra<br />

något med den informationen som finns i databasen, det räcker inte med att ha all<br />

information om man inte vet vad man ska göra med den. För att fortsätta beskriva hur man<br />

dynamiskt kan skapa och ändra på Flashobjekt måste uppsatsen först handla om lite layout<br />

så att man förstår ”vart” man menar när tar upp till exempel höger banneryta eller<br />

kontrollknapparna till spelaren.<br />

­ 31 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

3.2 Steg 3 – Layouten<br />

En sak till som är kraftfullt med Flash är att det oerhört lätt att ändra design och layout, man<br />

kan köra med ”klicka och dra” principen med allt. När man har sin bakomliggande logik och<br />

funktionalitet klar så är det inte svårt att testa olika möjligheter i layouten. I min spelare har<br />

jag några självklara areor som måste vara med eftersom det är en filmspelare. Man måste ha<br />

med någon form av tumnagelvisare där man kan se information och välja att spela ett klipp,<br />

vidare måste det finnas en area för att spela upp filmen i samt en kanal/genreväljare. Sedan<br />

tillkommer det plats för kommentarerna, pollningarna samt bannerytorna. Efter diskussion<br />

med EGAMES.TV [15] så kom vi fram till följande layout:<br />

[Bild på spelaren]<br />

­ 32 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

3.3 Steg 4 – Mer funktionalitet<br />

När man har skapat sina movieclips i Flash såsom en tumnagel för filmklipp finns det en del<br />

olika sätt att kopiera detta klipp och för att flytta det till rätt ställe. Om man har ”dragit” ut<br />

ett movieclip ifrån biblioteket och sedan döpt det till thumb_clip0 så kan man kopiera och<br />

placera kopian under den genom att skriva:<br />

duplicateMovieClip(thumb_clip0, "thumb_clip1", this.getNextHighestDepth());<br />

thumb_clip1._y = thumb_clip0._y+thumb_clip0._height;<br />

Man kan senare ta bort duplikatet genom att skriva:<br />

removeMovieClip(thumb_clip1);<br />

Ett annat alternativ och i mitt fall ett bättre alternativ är att skapa ett tomt movieclip och<br />

sedan ”lägga till” andra movieclips i den med hjälp av attachMovie(). Detta är bättre för att<br />

man får alla movieclips samlade i ett ”super movieclip” eller en ram om man så vill som man<br />

sedan kan referera till när man ska införa maskningar så att movieclips bara kan ses inom<br />

vissa områden. Visar med ett utdrag ur Flash där genre/kanal informationen har lästs in från<br />

databasen och sedan används funktionen makeGenres för att duplicera, sätta ut och ange<br />

attribut samt funktionalitet för de olika knapparna.<br />

//<br />

// Makes genres<br />

//<br />

function makeGenres(array:Array) {<br />

var arrLength = array.length;<br />

for (s = 0; s < arrLength; s++) {<br />

makeGenre(s);<br />

}<br />

// Set the mask<br />

_root.genres_mc.setMask(_root.genresHolder_mc);<br />

}<br />

//<br />

// Makes one genreclip with id i.<br />

//<br />

function makeGenre(i) {<br />

­ 33 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

var spacer:Number = 0;<br />

}<br />

var duplicate:MovieClip;<br />

var newY:Number = genresHolder_mc._y;<br />

var newX:Number = genresHolder_mc._x;<br />

for (z = 0; z < _root.genres_array.length; z++) {<br />

newX += _root.genres_array[z]._width + spacer;<br />

}<br />

var duplicate:MovieClip = _root.genres_mc.attachMovie("genreClip", "genreclip" + i, i);<br />

duplicate.genre_txt.text = duplicate.link;<br />

duplicate.bg_mc._width = duplicate.genre_txt._width + 5;<br />

duplicate._x = newX;<br />

duplicate._y = newY;<br />

duplicate.onPress = function() {<br />

changeGenre(duplicate.info, true);<br />

duplicate.bg_mc._alpha = 60;<br />

};<br />

// For easy scrolling.<br />

genres_array.push(duplicate);<br />

Variabeln duplicate som attachMovie() returnerar är alltså en movieclipinstans som man kan<br />

använda för att sätta attribut för det movieclips som man har lagt till ifrån biblioteket. Vidare<br />

finns det en text i genre instansen som heter genre_txt som sätts till värdet som kom ifrån<br />

databasen och redan är lagrad i en array som heter genrelinks_array. Sist sätts hela klippet till<br />

en mask som fungerar som en ”ram” så att man bara ser movieclipinstansen inom den<br />

ramen. Man kan argumentera för att man borde ha en generell funktion som tar massa<br />

parametrar och duplicerar samt placerar movieclips och där man sedan skriver de särskilda<br />

funktionera som till exempel onPress efteråt. En annan infallsvinkel är dock att även om det<br />

blir lite kodduplicering så är det mycket lättare att förstå hur det hela hänger ihop om man<br />

gör nya funktioner när man till exempel ska göra tumnaglarna. Eftersom de skiljer på så<br />

mycket i funktionalitet så blir det ändå lika mycket kod, det enda som händer är att det är<br />

svårare att få en överblick samt utveckla vidare.<br />

Eftersom jag använde ”ram” alternativet istället är det nu simpelt att göra en scrollerknapp<br />

till genre/kanal-knapparna eftersom de ligger i ett enda klipp.<br />

scroll_right_btn.onPress = function{<br />

­ 34 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

}<br />

genreClip._x ­= 25;<br />

Jag anropar en funktion som heter changeGenre() med ett genreobjekt som parameter i<br />

makeGenre(). Man kommer ganska långt om man jobbar med objekt som man skapat från<br />

databasen, nu när man skickar in ett genreobjekt som parameter till changeGenre() så har<br />

den automatiskt all information den behöver för att till exempel ändra alla banners, sätta<br />

igång en vinjett för just den genren och lista alla aktuella filmklipp med hjälp av den redan<br />

klara makeThumbnails(). Nu när man har tankegången klar för sig så kan man göra<br />

funktioner för att ändra banners, läsa in/lägga till kommentarer till filmklipp eller precis den<br />

funktionalitet man vill ha. Eftersom uppsatsen ska handla mer om bannerdelen så visar jag<br />

funktionen changeBanner() också, Flash laddar en Flashfil eller en bildfil på samma sätt<br />

vilket gör att funktionen blir lätt att förstå:<br />

//<br />

// Loads and changes the correct banner area.<br />

//<br />

function changeBanner(bannerlocation:String, newbanner:String, link:String) {<br />

if (bannerlocation == "top" ||<br />

(bannerlocation == "right" && !superrightbanner) ||<br />

(bannerlocation == "bottom" && !superbottombanner)) {<br />

if (!_root.maxvideo || bannerlocation == "top") {<br />

_root[bannerlocation + "banner_mc"].banner_area.loadMovie(newbanner);<br />

if (link != "" && bannerlocation != "top" && link != undefined) {<br />

_root[bannerlocation + "banner_mc"].onPress = function() {<br />

getURL(link, _blank);<br />

};<br />

}<br />

// dont show the bottombanner if the user is browsing the comments.<br />

if (_root.comments && bannerlocation == "bottom") {<br />

_root[bannerlocation + "banner_mc"]._visible = false;<br />

}<br />

}<br />

}<br />

}<br />

­ 35 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

3.4 Banners<br />

Enligt Mediable [16] finns det en mängd olika standardstorlekar på banners. Ett<br />

tillvägagångssätt att få en dynamisk bannermöjlighet i systemet är att ha en bannerstabell i<br />

databasen där man har x- och y-koordinater, storlek samt länkar till bannerbilden och vart<br />

man ska ta vägen när man klickar på bannern. Sen läser man in den banner som till exempel<br />

hör till en viss genre/kanal och sedan skapar man ett movieclip i Flash som man sedan sätter<br />

en klickfunktion på. Den enda nackdelen med detta sätt är att det blir för dynamiskt.<br />

Eftersom man antagligen vill att användare inte ska kunna sätta en banner över sin egen logo<br />

eller gömma något annat så gjorde jag fasta bannerplatser istället. Man läser dock in en länk<br />

till bilden och till destinationen när man klickar på länken. De flesta banners har idag egna<br />

knappar i sin banner, så om man lämnar destinationsfältet tomt i databasen får man se till att<br />

inte lägga på en egen klickfunktion i Flash som överskuggar de egentliga knapparna. Det<br />

man tjänar pengar på med en banner är hur många gånger den visas samt hur många gånger<br />

en besökare klickar på bannern. Därför är det naturligtvis ett måste att man på något sätt<br />

registrerar visningar samt klick. Detta är inget problem eftersom det bara kommer att<br />

fungera som en räknare som ökas på i en databas. Det finns avancerade bannersystem som<br />

hjälper en med det här och de fungerar på de flesta system eftersom man anropar deras<br />

script som ökar räknaren med en parameter vart man egentligen skulle, så systemet ökar rätt<br />

räknare och skickar sen vidare besökaren till rätt plats. I den spelare som denna uppsats<br />

handlar om så integrerade jag bannerbiten med ett opensource-bannersystem som heter<br />

phpAdsNew [17]. Med det programmet kan man lägga upp vad de kallar zoner och lägga in<br />

banners i dessa. Sedan kan man få en banner genom ett script som tar hänsyn till en massa<br />

parametrar som till exempel kan vara vilket land man är i, vilket operativsystem man<br />

använder eller vilken banner som visades innan.<br />

3.4.1 clickTAG<br />

Det blev lite problem att använda clickTAG som det står beskrivet högre upp. Egentligen är<br />

det meningen att man ska skicka in clickTAG variabeln efter i filnamnet till flashen. Nedan<br />

visas ett exempel:<br />

­ 36 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

Testflash.swfclickTAG=http://www.egames.tv/<br />

Funktionen som laddar andra Flashfiler i Flash struntar dock i allt som kommer efter men<br />

lyckligtvis så är ett movieclip i Flash ett objekt som allt annat så det gick att lösa genom att<br />

parsa ut clickTAG ur länken som Flash fick in och sedan sätta det som en variabel där<br />

bannen blev laddad.<br />

_root.rightbanner_mc.clickTAG= parsed_clickTAG;<br />

Jag har tänkt att om man inför all funktionalitet i detta system så får man ju ett eget separat<br />

system vilket gör att om man vill använda logiken ifrån ett befintligt system så kommer det<br />

att gå att kommunicera mellan dessa så länge båda arbetar emot samma databas eller ser till<br />

att de är varandras spegelbilder på den information som är väsentlig.<br />

3.5 Integration med Windows Media Player<br />

Det är alltid intressant att integrera en kraftfull applikation med en annan. Med hjälp av<br />

Flash 8 kan man som uppsatsen tidigare beskrivit anropa externa JavaScript samt returnera<br />

information tillbaka till Flash. Eftersom det går att bädda in Windows Media Player i en<br />

htmlsida och använda sig av JavaScript för att kontrollera spelningen av filmen så kan man<br />

lika gärna sköta anropen till JavaScripten ifrån Flash. Detta gör att man kan ha samma<br />

gränssnitt för både vanliga Flashfilmer samt för Windows Media Playerfilmer. Windows<br />

Media Player stöds bäst av Internet Explorer och Netscape men om man installerar en<br />

ActiveX komponent så går det att använda Firefox också. Eftersom många ”gamers” just nu<br />

hellre använder Firefox så är detta viktigt att veta att det går att utföra.<br />

­ 37 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

3.6 Extra funktioner<br />

3.6.1 Sökfunktion<br />

Eftersom det nu finns funktioner för att hämta data samt göra tumnaglar så är det lätt att<br />

göra en sökfunktion som söker genom moviecliptabellen och tar ut de filmklipp som<br />

matchar sökkriteriet.<br />

3.6.2 Subtitlesfunktion<br />

En bra funktion som man skulle kunna implementera är att man laddar en<br />

flvplaybackkomponent med ett filmklipp och börjar spela det. När man sedan klickar på<br />

musknappen så ska man stanna filmen och ge en dialogbox där man får skriva in en subtitle<br />

för den tiden. Sen fortsätter filmen och om man till exempel klickar på musen igen så ska<br />

man skriva i nästa subtitle (eller tom sträng för att ta bort den). När man har gått igenom<br />

hela filmen så ska dessa subtitles automatiskt läggas in till rätt filmklipp i databasen.<br />

3.6.3 Subtitle­parser<br />

Att få subtitles att passa i en film som står beskrivet ovan är inte svårt men det är mycket<br />

petigt. Om man skulle få lov att införa alla subtitles manuellt i databasen med rätt värden så<br />

skulle det vara ännu petigare. Eftersom Flash använder sig av sekunder och vanliga standard<br />

subtitles har ett format som liknar en digitalklocka (22:33:12,341) så måste man även<br />

konvertera detta innan man sätter in rätt värde i databasen. Därför är det en väldigt bra idé<br />

att ha en parser som tar en standard subtitlefil och gör om den till det format som Flash<br />

känner igen och sedan lägger in det i databasen med rätt värden.<br />

3.6.4 Dynamiska cuepoints<br />

Med Flash 8 så har det kommit en funktion som tillåter en programmerare att lägga till<br />

dynamiska cuepoints i ett filmklipp. Detta gör att ägaren av spelaren kan göra egna cuepoints<br />

­ 38 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

och sen fånga upp den i en viss film och göra en speciell sak. Ett exempel kan vara att det är<br />

en explosion i en film, då kan man anropa en JavaScriptfunktion som skakar på hela fönstret.<br />

Men ett bättre exempel är att man kan fånga upp en cuepoint som vill byta en banner<br />

eftersom filmen just nu visar den produkten som bannern riktar sig till. Även om man inte<br />

använder denna funktion så är det bra om den finns i databasen, i framtiden när spelaren<br />

utvecklas så kommer det att bli smidigt att ha den. Om man börjar ta betalt för att titta på<br />

klipp så kanske man vill kunna göra så att de första tio sekunderna är gratis eller liknande.<br />

Med dynamiska cuepoints så går det snabbt att införa godtrycklig funktionalitet som rör<br />

videoklippen.<br />

­ 39 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

­ 40 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

4 Slutsats<br />

För att nå ut till en bred internationell publik måste man finnas på flera ställen, en spelare<br />

som har möjligheten att byta ut sitt visuella gränssnitt kan ligga på flera sajter men ha en<br />

central knytpunkt. Med den knytpunkten tillkommer att man har stor kontroll över vad som<br />

visas och funktionerna i spelaren. Till exempel kan man styra alla banners och reklamklipp.<br />

Det är det bra att satsa på den applikationen som de flesta använder. Flash finns på 97,7 %<br />

av jordens internetburna datorer (Macromedia [5]). I och med senaste versionen så kan man<br />

också kommunicera med JavaScript och spela upp video på ett enkelt sätt.<br />

Det finns andra spelare som också har många användare, men eftersom nästan alla spelare<br />

går att bädda in i ett HTMLdokument och sedan kontrolleras genom JavaScript, så kan man<br />

lika gärna använda Flash som gränssnitt även om det inte är Flash <strong>Video</strong> man spelar upp.<br />

Detta tillvägagångssätt gör att man får en vektorbaserad layout på sin spelare som är lätt att<br />

göra dynamisk och byta ut. Perfekt för att nå ut till en bred publik och göra skräddarsydda<br />

layouter.<br />

För att spelaren ska få tillgång till den information som den behöver ifrån en databas så det<br />

en fördel att först göra om informationen till en XMLfil. På detta sätt så kan man utan vidare<br />

byta ut databasen till en annan och man behöver inte oroa sig för att några variabler skrivs<br />

över i Flash eftersom man bara behöver parsa ut dem som man vill använda.<br />

Vad gällande bannermöjligheterna så är det bästa att använda sig av ett befintligt och<br />

avancerat system för själva uppläggningen och registreringen av banners. Sedan behöver man<br />

bara möjligheten att i Flash ladda in en banner på valfritt ställe. Visserligen är denna uppsats<br />

projektspelare mer gjord så att spelaren är en egen applikation och har alla funktioner som<br />

den kan tänkas behöva. Men det är nog ingen nackdel eftersom man kan tänka sig att man<br />

någon gång skulle vilja lägga in en banner manuellt.<br />

­ 41 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

­ 42 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

5 Diskussion om resultatet<br />

Eftersom det är meningen att spelaren ska kunna klara av i princip hur många tittare som<br />

helst så kan det vara viktigt att hålla nere på antal serveranrop man gör ifrån Flash. Men för<br />

att undersöka om servern som spelaren ligger på klarar av detta så måste det göras ett test<br />

som har till avsikt att testa maxkapaciteten av vad spelaren klarar av.<br />

Tanken med spelaren är att man ska kunna ”äga” sin egen version av spelaren som ska ha sitt<br />

eget utseende och innehåll. Detta fungerar bra att göra genom att skicka med en parameter<br />

som berättar vilken spelare det är man vill se, dock hade det varit bättre att kolla varifrån<br />

besökaren kommer ifrån för att komma till spelaren. I PHP finns det en global variabel som<br />

heter $_SERVER['HTTP_REFERER'] som jag använde för just detta till en början, det visade sig<br />

senare att den inte var tillförlitlig i alla system eftersom den ibland inte skickas alls och den är<br />

lätt att förvanska. Detta kan bli ett problem i framtiden för spelaren eftersom en rimlig<br />

utbyggnad av spelaren kommer att innefatta att det ska finnas möjlighet att ta betalt för att<br />

visa ett visst klipp. Eftersom man inte säkert kan veta att de personer som ser klippen är från<br />

den sidan som har betalt eller om de är någon som bara har rätt länk så måste man införa en<br />

annan sorts betalsystem. Ett sådant kan vara att besökaren får skriva in användarnamn och<br />

lösenord i en ruta för verifiering innan klippet visas.<br />

Det visade sig medan projektet fortgick och EGAMES.TV försökte sälja sin spelare att de<br />

flesta ville ha en helt egen layout på sin spelare för att de skulle vara riktigt intresserade. Man<br />

kan ju förstå att de vill att spelaren ska passa in till resten av sidan, men att göra en ny layout<br />

för varje kund är ohållbart. Ett sätt att lösa det på är att ladda externa .swf filer där grafiken<br />

för det aktuella objektet finns så att kunden själv får ändra layouten på sin spelare där de<br />

tycker att det behövs. Problemet blir då att de lätt kan dölja sådant som är meningen att ska<br />

synas eller lägga in egen funktionalitet som kan bli en säkerhetsrisk.<br />

Spelaren verkar ha en begränsning vad gällande progressivt nedladdningsbara videoklipp,<br />

alltså att man inte använder en streamingserver. Ibland så stannade hela spelaren upp när<br />

man tittade på ett klipp som var runt fem sekunder långt. Men det berodde mer på klippet än<br />

på spelaren för när jag testade ett annat klipp som var lika långt fungerade det galant. Så man<br />

måste vara vaksam när det ska konverteras ifrån ett vanligt format till Flash<strong>Video</strong>format.<br />

Det är vanligt att en videospelare på nätet kan anpassa kvaliteten på videofilerna beroende på<br />

vilken uppkoppling man har. Denna koll är bra om det går automatiskt men det blir problem<br />

om man inför en sådan eftersom det är hastigheten mellan streamingservern och besökaren<br />

som är viktig. En lösning är att besökaren själv får välja vilken uppkopplingshastighet som<br />

gäller och som sen sparas i till exempel en cookie.<br />

­ 43 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

6 Referenser<br />

Verifierade den 18 maj 2006<br />

[1] The ESA<br />

URL: http://www.theESA.com/<br />

[2] Flash LiveDocs<br />

URL: http://livedocs.macromedia.com/<br />

[3] Answers<br />

URL: http://www.answers.com/topic/realplayer/<br />

[4] Real Player<br />

URL: http://www.real.com<br />

[5] Macromedia Flash Player Statistics<br />

URL: http://www.macromedia.com/software/player_census/flashplayer/.<br />

[6] Macromedia Flv<br />

URL: http://www.macromedia.com/devnet/Flash/articles/flv_download.html<br />

URL: http://www.macromedia.com/cfusion/knowledgebase/index.cfmid=tn_14571<br />

[7] Sepiroth Tutorials<br />

URL: http://www.sephiroth.it/tutorials/flashPHP/IWE_GB/page003.php<br />

[8] Flash-creations<br />

URL: http://Flash­creations.com/notes/dynamic_loadjpg.php<br />

[9] FlashBannerNow<br />

URL: http://www.flashbannernow.com/help/macromedia­flash­advertising­alliance.php<br />

­ 44 ­


UPPSALA UNIVERSITET<br />

<strong>Johan</strong> <strong>Andersson</strong><br />

Datavetenskapliga Programmet 821008­7154<br />

Examensarbete HT2005/VT2006<br />

[10] Zend<br />

URL: http://www.zend.com/zend/art/art­oertli.php<br />

[11] MySql Injektion<br />

URL: http://dev.mysql.com/tech­resources/articles/guide­to­PHP­security­ch3.pdf<br />

[12] Expressens Webb-tv<br />

URL: http://www.expressen.se/webb­tv/<br />

[13] Aftonbladets Webb-tv<br />

URL: http://www.aftonbladet.se/atv/player.html/<br />

[14] MTV Overdrive<br />

URL: http://www.mtv.com/overdrive/<br />

[15] EGAMES.TV<br />

URL: http://www.egames.tv/<br />

[16] MediaBle<br />

URL: http://www.mediable.net/se/res/standards_200103_iab.html<br />

[17] PhpAdsNew<br />

URL: http://phpadsnew.com/<br />

[18] MDTS<br />

URL: http://www.mdts.se/index.phpp=9<br />

[19] Akamai<br />

URL: http://www.akamai.com/<br />

­ 45 ­

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!