Johan Andersson Video Caster - Uppsala universitet
Johan Andersson Video Caster - Uppsala universitet
Johan Andersson Video Caster - Uppsala universitet
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 8210087154<br />
Examensarbete HT2005/VT2006<br />
2
UPPSALA UNIVERSITET<br />
<strong>Johan</strong> <strong>Andersson</strong><br />
Datavetenskapliga Programmet 8210087154<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 8210087154<br />
Examensarbete HT2005/VT2006<br />
4
UPPSALA UNIVERSITET<br />
<strong>Johan</strong> <strong>Andersson</strong><br />
Datavetenskapliga Programmet 8210087154<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 DATABASPHPXMLFLASH VS DATABASPHPFLASH...................................................................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 Subtitleparser .........................................................................................................................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 8210087154<br />
Examensarbete HT2005/VT2006<br />
6
UPPSALA UNIVERSITET<br />
<strong>Johan</strong> <strong>Andersson</strong><br />
Datavetenskapliga Programmet 8210087154<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 8210087154<br />
Examensarbete HT2005/VT2006<br />
8
UPPSALA UNIVERSITET<br />
<strong>Johan</strong> <strong>Andersson</strong><br />
Datavetenskapliga Programmet 8210087154<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 ondemandTV 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 8210087154<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 8210087154<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 8210087154<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 8210087154<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 8210087154<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 DatabasPHPxmlFlash vs DatabasPHPFlash<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 8210087154<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 8210087154<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 Flashcreations [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 8210087154<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 8210087154<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 8210087154<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 8210087154<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 8210087154<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 8210087154<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 8210087154<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 8210087154<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 8210087154<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 8210087154<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 8210087154<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 8210087154<br />
Examensarbete HT2005/VT2006<br />
[ Umldiagram över databasstrukturen ]<br />
28
UPPSALA UNIVERSITET<br />
<strong>Johan</strong> <strong>Andersson</strong><br />
Datavetenskapliga Programmet 8210087154<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 8210087154<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 8210087154<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 8210087154<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 8210087154<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 8210087154<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 8210087154<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 8210087154<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 8210087154<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 8210087154<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 Subtitleparser<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 8210087154<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 8210087154<br />
Examensarbete HT2005/VT2006<br />
40
UPPSALA UNIVERSITET<br />
<strong>Johan</strong> <strong>Andersson</strong><br />
Datavetenskapliga Programmet 8210087154<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 8210087154<br />
Examensarbete HT2005/VT2006<br />
42
UPPSALA UNIVERSITET<br />
<strong>Johan</strong> <strong>Andersson</strong><br />
Datavetenskapliga Programmet 8210087154<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 8210087154<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://Flashcreations.com/notes/dynamic_loadjpg.php<br />
[9] FlashBannerNow<br />
URL: http://www.flashbannernow.com/help/macromediaflashadvertisingalliance.php<br />
44
UPPSALA UNIVERSITET<br />
<strong>Johan</strong> <strong>Andersson</strong><br />
Datavetenskapliga Programmet 8210087154<br />
Examensarbete HT2005/VT2006<br />
[10] Zend<br />
URL: http://www.zend.com/zend/art/artoertli.php<br />
[11] MySql Injektion<br />
URL: http://dev.mysql.com/techresources/articles/guidetoPHPsecuritych3.pdf<br />
[12] Expressens Webb-tv<br />
URL: http://www.expressen.se/webbtv/<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