Levysoft

Registrare un flusso video di una webcam con FFMPEG su un server creato al volo su DigitalOcean

Ogni anno, sulla torre di trasmissione di Telecom sulla Cassia a Roma, nidificano due falchi pellegrini, Alice e Virgilio. Quest’anno la mamma ha dato alla luce 4 piccoli falchetti, detti pulli: Rain, Sole, Nube e Duemari. Per un paio di mesi è stato possibile vedere in diretta streaming tutta la fase della covata e, poi, della crescita dei piccoli, grazie ad una webcam installata sul nido accesa 24 ore su 24 ore e raggiungibile a questo indirizzo di BirdCam.it.
Per un certo periodo ho avuto necessità di registrare il video di alcuni eventi, come la schiusa o il primo volo, e se all’inizio era sufficiente la funzionalità di “Registrazione Schermo” di Quicktime su Mac OS X, alla lunga mi costringeva a lasciare il computer sempre acceso. Inoltre certi fatti non potevano essere previsti e quindi ho optato per una soluzione di registrazione automatica del flusso video.

Identificare la url del flusso video

Il primo passo necessario è identificare l’indirizzo url da cui proviene il flusso video dello streaming. Sulla pagina all’indirizzo http://www.birdcam.it/webcam-2/ è presente una versione Flash che maschera l’origine. Cliccando, però, sul link “Fullscreen – Schermo pieno” si raggiunge la pagina: http://www.birdcam.it/full_alice.html.
Ed è da qui che, analizzando il codice sorgente della pagina, all’interno del tag video si può trovare il link del flusso rtmp/mp4:

Creare un server su DigitalOcean

Avendo accumulato qualche credito su DigitalOcean e siccome il mio progetto era temporaneo, ho pensato bene di creare una istanza minimima (droplet) da 5 dollari al mese (ovvero 0,007 dollari all’ora). Il vantaggio di questo hosting è che si può avere un server dedicato con hard disk SSD con il sistema operativo che più si preferisce pagando, solo finché l’istanza è attiva, un prezzo davvero irrisorio.
Pensate, con un server che ho creato e distrutto in soli dodici minuti, considerando che l’unità minima è di 1 ora, ho spesso solamente 1 centesimo di dollaro. Invece per un server che ho tenuto attivo per quasi 4 giorni per testare una server con preinstallato Ghost, ho speso solo 0,51 dollari.
Infine, tra le opzioni incluse nel pacchetto base, è quella di poter salvare, in qualsiasi momento, anche uno snapshot del server (a freddo, quindi a server spento), per avere un rapido backup di una configurazione del server. Inoltre, lo snapshot, permettendo di salvarsi l’immagine della vostra macchina (con tutti gli script installati e le righe di crontab), è anche un ottimo modo per preservare la propria installazione customizzata senza dover per forza lasciarla attiva, ma attivandola e cancellandola all’occorrenza, visto che rimane nel vostro profilo anche quando cancellato la droplet. Considerando il fatto che creare una nuova droplet, o in questo caso ripristinarla, è veramente una questione di pochi minuti e considerando anche che si paga solo per il tempo effettivo di utilizzo, il vantaggio di creare gli snapshot è evidente, soprattuto se usate il server poche volte al mese: risparmiare molti soldi.

Se poi, come abbiamo detto poco fa, la creazione di una istanza è rapidissima, è facile dedurre che la piattaforma di DigitalOcean è perfetta per tutti quei progetti che non richiedono grosse risorse e che hanno una durata temporale breve (se poi si richiede una maggiore potenza di calcolo o una banda maggiore, è sufficiente scegliere il piano che più si gradisce sapendo a priori quanto si va a pagare in un mese).

Per il mio scopo ho semplicemente creato una istanza da 5 dollari al mese che mi dava a disposizione:

Quindi ho scelto di preinstallare la distribuzione CentOS 6.7 X64 sul datacenter più vicino all’Italia disponibile, ovvero quello di Londra.

L’operazione di creazione della istanza ha impiegato meno di 1 minuto e nel frattempo era già arrivata la mail con le credenziali di accesso SSH (con relativa password temporanea):

Installazione di FFMPEG

La parte più lunga è stata quella di trovare una installazione di FFMPEG funzionante senza avere problemi con le dipendenze da librerie esterne e senza compilazioni malfunzionanti. Senza dilungarmi su dettagli, vi dico subito che se andate sul sito ufficiale di FFMPEG.org potete scaricare direttamente un pacchetto già precompilato perfettamente funzionante sulla piattaforma di CentOS:

Questi i passi da seguire dalla shell linux (notate che, essendo il pacchetto compresso con xz, ho dovuto installare anche la relativa applicazione):

Catturare il flusso video streaming

Avendo precedentemente trovato la url dello streaming video, non ho fatto altro che lanciare la seguente riga di comando:

Ovviamente il primo avvio non ha funzionato perché ha dato il seguente errore: “Failed to resolve hostname player.adobemediaserver.it: Name or service not known“.
Essendo questa una installazione provvisoria non mi sono messo a capire il motivo del problema ma ho semplicemente trovato l’indirizzo ip del server “player.adobemediaserver.it” con un semplice ping:

e rilanciato il comando come segue:

A video vedrete una serie di righe che scorrono come questa:

Se volete lanciarlo in background senza avere a video nessun output ma salvando gli errori in un file di log, questo è il comando:

Ovviamente però il processo non si interromperà a meno che non killerete il processo con un “kill -9 PID”.

CREAZIONE SCRIPT e SCHEDULAZIONE NEL CRONTAB

Siccome avevo necessità di registrare il video alle prime luci del giorno (inutile registrare durante la notte perché non vi era, fortunatamente, alcuna forma di illuminazione notturna) ho creato al volo uno script in bash come segue:

e quindi con il comando “crontab -e” ho inserito la seguente riga nel crontab per farlo partire alle 5:55 di mattina (ovvero all’alba):

Attenzione: il server non è in Italia per cui, dopo aver controllato l’ora locale, ho sottratto 6 ore dall’ora italiana, impostando così la partenza dello script a alle 23:55 ora locale del server per avere una partenza effettiva della registrazione alle ore 5:55 ora italiana.

TRASFERIMENTO DEL VIDEO

Una volta conclusa la fase di registrazione (in questa fase preliminare per stoppare il processo eseguivo, brutalmente un kill del relativo pid) dovevo trasferire il video appena salvato dal server al mio computer. Detto fatto: basta aprire il Prompt dei Comandi da Windows o il Terminale di Mac OS X e si esegue il semplice accesso SFTP sul server remoto di DigitalOcean con le credenziali ricevute via email (che sono le stesse per usate per l’accesso SSH) ed eseguire una GET del file:

CONCLUSIONE

Ovviamente lo script in bash si può migliorare, come anche la gestione della registrazione del flusso video, ma lo scopo del presente articolo è quello di illustrare una delle tante procedure possibile e far capire come si può risolvere un problema, apparentemente complicato, in maniera molto veloce.