Realizzare un videoblog con upload dei video come YouTube sul proprio sito web (Parte I)

In questo tutorial vedremo come integrare il video-bloggingFLV in un sito web basato sul framework Django. Ciòpermetterà agli utenti del nostro blog il posting diarticoli che, una volta pubblicati, potranno essereparticolareggiati da ciascun utente tramite l'inserimento di video, che chiunque potràvisualizzare.Il lavoro si suddivide in diverse parti:

  • Un modella Django ove immagazzinare il video e le informazioni ad esso associate;
  • Un form di upload tramite il quale l' utente può uppare il suo video;
  • Conversione del video in un formato fruibile via web;
  • Ricavarne ulteriori dettagli;
  • Riprodurre il video nel browser;
  • Rendere il player video user-friendly;
  • Fornire ulteriori funzionalità;

Modello Django

Il modello Django per l' inserimento di un video èpiuttosto semplice. Lo abbiamo chiamato VideoSubmission:

    class VideoSubmission(models.Model):    videoupload = models.FileField (upload_to='videoupload')    relatedsubmission = models.ForeignKey(Submission, null=True)    comment = models.CharField( maxlength=250, blank=True )    flvfilename = models.CharField( maxlength=250, blank=True, null=True )

 

Upload del video

L' upload di un video è raggiungibile utilizzandouno standard form di upload, implementato, come segue, delFormFields:

    def v_addvideo(request, submissionid):    manipulator=VideoSubmission.AddManipulator()    form=FormWrapper(manipulator,{},{})    params = {'userAccount':request.user,'form':form,}    c = Context( request, params)    t = loader.get_template('video/addvideo.html')    sub = Submission.objects.get(pk=submissionid)    params['submission'] = sub    return HttpResponse( t.render( c ) )

 

La pagina di upload, chiamata addvideo.html èmolto semplice:

    <form action="/video/upload/" method="post" enctype="multipart/form-data"><table>  <input type="hidden" name="relatedsubmission_id" value="{{submission.id}}" />    <tr valign="top"><td>Video hochladen:<br/>(Nur AVI und FLV werden akzeptiert)</td><td>{{ form.videoupload}} {{ form.videoupload_file }}<br/>Kommentar: <input type="text" name="comment"   style="width:100%" maxlength="250"></td>    </tr>    <tr valign="top"><td> </td><td><input type="submit" Value="Hochladen"/> </td>    </tr></table></form>

 

Come possiamo notare, ad ogni nuovo video aggiunto vieneassociato un ID, che sarà utile per concatenare traloro i video.

Convertire i video in formato web

Con grande frequenza accadrà che i nostri utentiupperanno nel servizio un video con estensione .AVI, formatonon supportato dalla visualizzazione interna al browser. Comerisolvere? Convertendolo in formato FLV (Flash(tm)Video), quello utilizzato da YouTube, per intenderci.

Convertire in FLV

Come fare? Il pacchetto OSS ffmpeg ci viene in aiuto,fornendoci una funzione di conversione assolutamenteinvidiabile. Il pacchetto è utilizzabile tramite lineadi comando, con la sintassi:

ffmpeg -i [sourcefile.avi] -acodec mp3 -ar 22050 -ab 32 -f flv -s 320×240 [destfile.flv]

Aggiungere i metadata all' FLV

Con la sopra-riportata procedura verrà creato un nuovo.FLV contenente il flusso audio-video contenuto nell' avidi partenza. I files FLV però hanno bisogno di altreinformazioni, quali la durata, il numero di frames ed altriinteressanti parametri, utili ai players FLV perrappresentare graficamente la durata del video ed i minuti altermine. Stranamente, ffmpeg non aggiunge tali informazioni.Fortunatamente c'è un secondo pacchetto, flvtool2, ingrado di ricavare le info necessarie da un file .FLV e diinserirvele come metadata. Ecco il comando:

flvtool2 -U [flvfile]

Aggiungere un immagine al video

Bello sarebbe permettere agli utenti che postanoun video l' upload di un' immagine esplicativa,utilizzabile come piccola anteprima. Ecco che ci torna utileffmpeg, in grado di estrarre singoli frames dal flusso videodell' FLV. Ecco il comando relativo:

ffmpeg -y -i [videofile] -vframes 1 -ss 00:00:02 -an -vcodec png -f rawvideo -s 320×240 [thumbnailimage.png]

Collegare il tutto

A questo punto è semplice dar vita ad un buon sistemadi conversione video che entra in funzione ad ogni upload.Ecco il codice relativo:

    def convertvideo (video):    if video is None:  return "Kein Video im Upload gefunden"    filename = video.videoupload    print "Konvertiere Quelldatei: %s" + filename    if filename is None:  return "Video mit unbekanntem Dateinamen"    sourcefile = "%s%s" % (settings.MEDIA_ROOT,filename)    flvfilename = "%s.flv" % video.id    thumbnailfilename = "%svideos/flv/%s.png" % (settings.MEDIA_ROOT, video.id)    targetfile = "%svideos/flv/%s" % (settings.MEDIA_ROOT, flvfilename)    ffmpeg = "ffmpeg -i %s -acodec mp3 -ar 22050 -ab 32 -f flv -s 320x240 %s" %(sourcefile,  targetfile)    grabimage = "ffmpeg -y -i %s -vframes 1 -ss 00:00:02 -an -vcodec png -f rawvideo -s 320x240 %s " % (sourcefile, thumbnailfilename)    flvtool = "flvtool2 -U %s" % targetfile    print ("Source : %s" % sourcefile)    print ("Target : %s" % targetfile)    print ("FFMPEG: %s" % ffmpeg)    print ("FLVTOOL: %s" % flvtool)    try:  ffmpegresult = commands.getoutput(ffmpeg)  print "-------------------- FFMPEG ------------------"  print ffmpegresult  # Check if file exists and is > 0 Bytes  try:s = os.stat(targetfile)print sfsize = s.st_sizeif (fsize == 0):    print "File is 0 Bytes gross"    os.remove(targetfile)    return ffmpegresultprint "Dateigroesse ist %i" % fsize  except:print sys.exc_info()print "File %s scheint nicht zu existieren" % targetfilereturn ffmpegresult  flvresult = commands.getoutput(flvtool)  print "-------------------- FLVTOOL ------------------"  print flvresult  grab = commands.getoutput(grabimage)  print "-------------------- GRAB IMAGE ------------------"  print grab    except:  print sys.exc_info()  return sys.exc_info[1]    video.flvfilename = flvfilename    video.save()    return None

 



Ti potrebbe interessare anche

commenta la notizia

Ci sono 3 commenti
FabioVitale
molto interessane.. questo script
ma non si può avere con le pagine già fatte e compattate in zip?
perchè veramente non riesco a capire dove inserire i codici nelle relative pagine..
Grazie mille