Wie sind eigentlich Seiten wie YouTube aufgebaut? Warum kann man da mit einfachen Tools die Videos runterziehen? Wie baut man sowas? Fragen über Fragen. Habt ihr Lust auf ein paar Antworten? Ich schon.
Beginnen wir unseren Ausflug mit dem Webbrowser auf ein Video Portal und sehen wir uns ein solches Video einmal an. Als Beispiel würde ich dieses hier vorschlagen:
Gehen wir einmal davon aus, dass alles was wir uns im Web ansehen irgendwie heruntergeladen werden muss, um es darstellen zu können. In unserem Fall, die Website um den Videoclip und den Clip selbst. Wie ich darauf komme ist einfach: Wenn ich die Seite neu lade, ist das Video schon komplett geladen und es lässt sich gleich anzeigen.
Als Test für meine Behauptung lösche ich also alle Objekte in meinem Browser-Cache und lade die Seite neu um diesen dann zu inspizieren. Et voilà: wir haben ein SWF Objekt im Cache, welches ich einem entsprechenden Player füttere. Doch irgendwie will das Ganze noch nicht so ganz abspielen. Ist da noch mehr?
In der Tat – eine komisch anmutende Datei vom Typ FLV gurkt hier noch herum – offensichtlich eine Eigenheit von Macromedia. Ein kleiner Ausflug durch Google bestätigt meine Vermutung. Ich sehe mir noch ein paar andere Videos an und nun kommt der Knaller: Die SWF Datei bleibt davon relativ unbeeindruckt – Es sammeln sich nur einige FLV Dateien an.
Ich nehme also an, dass sich dort die Videos verstecken und schaue mir die Datei genauer an. Vielleicht kann ich ja meinen Verdacht beweisen. Ich benenne also unser flv File um und lasse den Allesspieler ‚mplayer‘ einmal drauf los. Der Versuch an sich ist eventuell etwas plump, aber sollte er klappen, habe ich einen Anhaltspunkt, mit dem es sich sicher weiterarbeiten lässt:
~ $ mplayer PenguinsLinuxAd.flv MPlayer dev-SVN-r27120-4.3.1 (C) 2000-2008 MPlayer Team CPU: Genuine Intel(R) CPU T2500 @ 2.00GHz (Family: 6, Model: 14, Stepping: 8) CPUflags: MMX: 1 MMX2: 1 3DNow: 0 3DNow2: 0 SSE: 1 SSE2: 1 Compiled with runtime CPU detection. Playing PenguinsLinuxAd.flv. libavformat file format detected. [lavf] Video stream found, -vid 0 [lavf] Audio stream found, -aid 1 VIDEO: [FLV1] 480x360 0bpp 28.083 fps 0.0 kbps ( 0.0 kbyte/s) ========================================================================== Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family Selected video codec: [ffflv] vfm: ffmpeg (FFmpeg Flash video) ========================================================================== ========================================================================== Opening audio decoder: [mp3lib] MPEG layer-2, layer-3 AUDIO: 44100 Hz, 2 ch, s16le, 64.0 kbit/4.54% (ratio: 8000->176400) Selected audio codec: [mp3] afm: mp3lib (mp3lib MPEG layer-2, layer-3) ========================================================================== AO: [alsa] 48000Hz 2ch s16le (2 bytes per sample) Starting playback... VDec: vo config request - 480 x 360 (preferred colorspace: Planar YV12) VDec: using Planar YV12 as output csp (no 0) Movie-Aspect is undefined - no prescaling applied. VO: [xv] 480x360 => 480x360 Planar YV12 A: 7.4 V: 7.4 A-V: -0.000 ct: 0.000 0/ 0 5% 0% 2.5% 2 0
Ob ihr es glaubt oder nicht ich kann das Video ansehen. FLA muss demnach also ein Video-Format sein. Ich mache einfach mal den Test und jage die Datei durch ffmpg:
~ $ ffmpeg -i PenguinsLinuxAd.flv PenguinsLinuxAd.mp4 FFmpeg version UNKNOWN, Copyright (c) 2000-2008 Fabrice Bellard, et al. configuration: --prefix=/usr --libdir=/usr/lib --shlibdir=/usr/lib --mandir=/usr/share/man --enable-static --enable-shared --cc=i686-pc-linux-gnu-gcc --disable-altivec --disable-debug --disable-ffplay --disable-network --disable-optimizations --enable-libfaac --enable-libmp3lame --enable-libvorbis --enable-libxvid --enable-liba52 --enable-libdc1394 --enable-pthreads --enable-x11grab --enable-libfaad --enable-libamr-nb --enable-libamr-wb --enable-nonfree --enable-gpl --enable-postproc --enable-avfilter --enable-avfilter-lavf --enable-swscale --disable-stripping libavutil version: 49.6.0 libavcodec version: 51.53.0 libavformat version: 52.12.0 libavdevice version: 52.0.0 libavfilter version: 0.0.0 built on Jul 2 2008 16:52:29, gcc: 4.3.1 Seems stream 0 codec frame rate differs from container frame rate: 1000.00 (1000/1) -> 28.08 (337/12) Input #0, flv, from 'PenguinsLinuxAd.flv': Duration: 00:00:51.1, start: 0.000000, bitrate: 64 kb/s Stream #0.0: Video: flv, yuv420p, 480x360, 28.08 tb(r) Stream #0.1: Audio: mp3, 44100 Hz, stereo, 64 kb/s Output #0, mp4, to 'PenguinsLinuxAd.mp4': Stream #0.0: Video: mpeg4, yuv420p, 480x360, q=2-31, 200 kb/s, 28.08 tb(c) Stream #0.1: Audio: libfaac, 44100 Hz, stereo, 64 kb/s Stream mapping: Stream #0.0 -> #0.0 Stream #0.1 -> #0.1 Press [q] to stop encoding frame= 1420 fps= 46 q=31.0 Lsize= 2047kB time=50.6 bitrate= 331.6kbits/s video:1629kB audio:388kB global headers:0kB muxing overhead 1.477593%
Und nun haben wir ein MP4-File, welches sich als solches abspielen lässt. Ich würde sagen, dass so das Herunterladen von Videos erklärt ist. Der sog. Grabber holt sich die FLV Datei und konvertiert sie in das gewünschte Format – so wie wir es eben manuell gemacht haben.
Gehen wir einmal davon aus, dass Videos auch in FLV Dateien konvertiert werden können und Flash eben diese einbinden kann, selbst während diese noch geladen werden. Eben wie ein Stream, nur ohne Streamingserver. Wie wir das Ganze hier gewonnene Wissen dann einsetzen und selbst so einen Player bauen, sehen wir uns aber im nächsten Teil an…