Realizzare un Clone di YouTube

Data: 10 marzo 2007 Categoria: video, webdev

Il funzionamento di YouTube (e tutti gli altri siti di video sharing) si basa essenzialmente sulla conversione di file video nel formato FLV (FLash Video) da riprodurre con un player Flash. Sul finire del 2006, pescando nel grande mare del software free e open source, ho voluto verificare se fosse possibile realizzare una bozza di applicazione che avesse le stesse funzionalità.

Va detto subito che non è ipotizzabile, neanche su scala ridotta, farsi un sitarello di video sharing in hosting, per tre motivi tutti ugualmente proibitivi:

  1. software: bisogna installare dei software aggiuntivi che sicuramente non vengono installati sui sistemi dedicati a fare hosting;
  2. potenza di calcolo: il processo di conversione è pesante rispetto ai normali compiti di un server web, soprattutto se ci sono diversi processi in contemporanea;
  3. banda (entrata e uscita): i file video in upload sono grossi diversi megabyte, anche se sono di breve durata, mentre in uscita, considerando sia i flussi di chi vede i video sul sito sia i flussi per chi incorpora i video in altri siti, la richiesta giornaliera può diventare stratosferica.

Dato che una macchina sola non può ovviamente reggere, anche la possibilità dell'housing diventa problematica. Mettere in housing un cluster di macchine dimensionato per reggere adeguatamente il carico diventa molto costoso.

Software utilizzati:

  • mencoder (fa parte di mplayer): per la conversione in formato FLV
  • FLV Player per visionare i video nelle pagine web
  • ffmpeg per la generazione delle miniature

I test sono stati eseguiti su una macchina FreeBSD 6.0.
Il sito di test (front-end e back-end) è stato realizzato con PHP 4.4.5 e MySQL 4.1.21.

Ispirazione: Video Blogging using Django and Flash Video

Come funziona

Tutte le informazioni sul video (titolo, data, ecc.) vengono salvate nel database mentre i file video rimangono su disco.

A grandi linee il flusso di lavoro è questo:

  1. un utente carica un file video (avi, mpg, mov, ...) e viene inserito un record nel database;
  2. ogni 5 minuti un cronjob controlla se ci sono nuovi file da convertire;
  3. in caso positivo, una serie di script Bash e PHP si occupano della conversione video in FLV, generazione miniatura e cancellazione dell'originale;
  4. nel database viene aggiornato il record e il video diventa disponibile sul sito.

Crontab conversione:

0-55/5 * * * * /usr/local/bin/php /path/convert.php > /dev/null

convert.php a sua volta richiama gli script per la conversione video e la generazione della miniatura. Non riporto gli script completi (è inutile) ma solo le parti interessanti, cioè le routine di generazione.

Codifica (encode.sh  ):

/usr/local/bin/mencoder video_originale.avi -o video.flv
-lavfopts i_certify_that_my_video_stream_does_not_use_b_frames
-of lavf
-oac mp3lame
-lameopts abr:br=56
-ovc lavc
-lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3
-vf scale=320:240
-srate 22050
-msglevel all=0 > /dev/null 

Il video verrà ridimensionato a 320×240 pixel.

Miniatura (thumbs.sh):

/usr/local/bin/ffmpeg -i video.flv -vcodec png -vframes 2 -an -f rawvideo -s 120x90 miniatura.png 

La miniatura viene generata in formato PNG con dimensioni 120×90 pixel.

Per visualizzare il video (play.php):

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="320" height="260">
<param name="movie" value="flvplayer.swf" />
<param name="quality" value="high" />
<param name="scale" value="noscale" />
<param name="BGCOLOR" value="#181818" />
<param name="flashvars" value="file=video.flv&showdigits=true&autostart=true&showfsbutton=false" />
<embed
src="flvplayer.swf" mce_src="flvplayer.swf"
width="320"
height="260"
quality="high"
scale="noscale"
bgcolor="#181818"
type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer"
flashvars="file=video.flv&showdigits=true&autostart=true" />
</object> 

Il codice fa l'embed del player, non del video.
Il video va passato al player tramite la variabile flashvars.

La parte fondamentale è tutta qui. Il resto è una normale applicazione per la visualizzazione del sito e per un back-end di amministrazione. Io ho usato il PHP, ma si potrebbe usare qualunque altro linguaggio, non c‘è niente di diverso dalla gestione di una galleria foto con vari utenti.

L'applicazione di test gira tranquillamente sul mio serverino casalingo, anche se l'ho ormai abbandonata. Mi interessava solo capire cosa c‘è tecnicamente dietro alla bomba del 2006 (e 2007), ovvero i video on-line. Tutte le rifiniture di una vera applicazione sarebbero state solo una perdita di tempo dato che io un clone di YouTube non lo farò mai.

Dopo mesi che non ci pensavo più l'ho riguardata e mi è venuta voglia di passarla ai posteri.

Screenshot

Qui di seguito alcuni screenshot dell'applicazione che ho chiamato MyTube. Sì lo so, la grafica è scarna. L'ho già detto che questo è solo un prototipo e non un'applicazione plug-n-play?

Considerazioni finali

Il pacco di soldi con cui Google ha comprato YouTube non sono stati dati per la tecnica sopraffina dell'applicazione (invero abbastanza banale come si è visto) ma per l'enorme base di utenti. Google ha comprato gli utenti di YouTube, non l'applicazione di YouTube. Ai suoi fondatori il merito (ben ricompensato!) di aver avuto per primi l'idea, o di essere stati semplicemente i primi a realizzarla.

Il settore del video on-line si sta saturando, in Web Video Cheat Sheet vengono elencati circa 80 siti che si scopiazzano. Certo ci sono le nicchie, ma sono redditizie? Forse solo quella del porno.

Le risose hardware e di connettività, senza tralasciare le professionalità coinvolte nella manutenzione e sviluppo, richiedono investimenti consistenti. Non è possibile partire come progetto amatoriare sperando di crescere ed essere acquisiti come è stato per del.icio.us, bisogna partire con la grana sin da subito.

Molti dei siti di video on-line usano software gratuito e a sorgente aperto esattamente come ho fatto io. Spero che chi guadagna con questa roba si ricordi di donare qualcosa agli sviluppatori, senza la cui capacità (e passione) buona parte del Web2.0 non esisterebbe.

Se rinasco vado a fare l'idraulico.

Commenti

23/07/2008 03:32 - Pasquale

Salve,
potresti aiutarmi nel realizzare un file per convertire i video in formato flv? Ovviamente non gratis:-) Buona giornata
Pasquale