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

In questo tutorial vedremo come integrare il video-blogging FLV in un sito web basato sul framework Django. Ciò permetterà agli utenti del nostro blog il posting di articoli che, una volta pubblicati, potranno essere particolareggiati 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 utilizzando uno standard form di upload, implementato, come segue, del FormFields:

    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 viene associato un ID, che sarà utile per concatenare tra loro i video.

Convertire i video in formato web

Con grande frequenza accadrà che i nostri utenti upperanno nel servizio un video con estensione .AVI, formato non supportato dalla visualizzazione interna al browser. Come risolvere? 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 assolutamente invidiabile. Il pacchetto è utilizzabile tramite linea di 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' avi di partenza. I files FLV però hanno bisogno di altre informazioni, quali la durata, il numero di frames ed altri interessanti parametri, utili ai players FLV per rappresentare graficamente la durata del video ed i minuti al termine. Stranamente, ffmpeg non aggiunge tali informazioni. Fortunatamente c'è un secondo pacchetto, flvtool2, in grado di ricavare le info necessarie da un file .FLV e di inserirvele come metadata. Ecco il comando:

flvtool2 -U [flvfile]

Aggiungere un immagine al video

Bello sarebbe permettere agli utenti che postano un video l' upload di un' immagine esplicativa, utilizzabile come piccola anteprima. Ecco che ci torna utile ffmpeg, in grado di estrarre singoli frames dal flusso video dell' 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 sistema di 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 s
            fsize = s.st_size
            if (fsize == 0):
                print "File is 0 Bytes gross"
                os.remove(targetfile)
                return ffmpegresult
            print "Dateigroesse ist %i" % fsize
        except:
            print sys.exc_info()
            print "File %s scheint nicht zu existieren" % targetfile
            return 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