Recentemente, mi è capitato di occuparmi di un paio di progetti che riguardavano la registrazione di video. Uno di questi era un progetto di imaging 3D in cui volevamo usare cinque video 1080p per registrare la rotazione di 1 minuto di un oggetto su una piattaforma, cosa che ci ha fornito una quantità enorme di dati con cui addestrare un software di riconoscimento delle immagini.
L'altro progetto è davvero entusiasmante perché il nostro laboratorio accoglierà un ospite speciale e stavo cercando di capire in che modo possiamo spingere la community a interessarsi ad alcune delle cose che andremo a costruire. Perché non riprodurre in diretta streaming l'intero laboratorio sul nostro canale YouTube in modo che tutti possano vedere ciò su cui stiamo lavorando e interagire con noi?
Questi progetti sono entrambi divertenti e dal momento che avevamo a disposizione un sacco di Raspberry Pi 3, ho deciso di usarne uno e di vedere se riuscivo a fargli registrare una serie di video o a trasformarlo in un dispositivo di streaming efficace in modo da non dover sottrarre al nostro tecnico video un computer portatile più potente. Se fossi riuscito a far eseguire queste attività a questo piccolo computer a scheda singola avrei potuto lasciare libere macchine più potenti, inoltre sarebbe stata una bella demo, ma mi stavo domandando se la scheda aveva davvero la potenza necessaria per farlo.
Inizialmente, mi sono limitato a cercare tutto quello che potevo sulla registrazione di video e ho scelto di cercare di lavorare con una webcam USB che avevo a portata di mano, la Logitech C920, e di cercare di utilizzare la NoIR Pi Camera che avevamo usato nel progetto Fridge Defender. Sebbene Raspberry Pi sia dotato di alcuni software per la registrazione video come Streamer, ho deciso di intraprendere un percorso diverso e di lavorare con la libreria FFmpeg, che è seguita da una numerosa comunità e dispone di moltissime opzioni per encoder diversi, cosa che mi offriva la flessibilità e un gran numero di esempi da cui prendere spunto.
I miei risultati iniziali non furono incoraggianti. L'uso della libreria ffmpeg per registrare video dalla webcam USB su un file AVI non mi diede i risultati sperati; il Raspberry PI avrebbe raggiunto il 50% di utilizzo della cpu e non sarebbe stato in grado di registrare video a 1080p a una velocità ragionevole di 30 fotogrammi al secondo. Quando sono andato a esaminare i risultati, i circa 6,6 fotogrammi al secondo mi fornivano un video incostante e inutilizzabile per lo streaming del nostro laboratorio o per realizzare una creazione di un oggetto in 3D. Sono sceso a 720p e ho riscontrato qualche miglioramento a 14 fotogrammi al secondo, ma questo non era di alcuna utilità. Passando al formato WVGA (che è 854x480), sono riuscito finalmente ad avere i 30 fotogrammi al secondo costanti che stavo cercando, ma la qualità del video lasciava molto a desiderare, e per il riconoscimento dell'immagine, più pixel si hanno a disposizione meglio è. Ero deluso dal mio piccolo Pi, ma non ero ancora pronto a gettare la spugna.
A questo punto, potevo scegliere di passare a un computer diverso più potente o di scavare più a fondo. Ho deciso di "scavare più a fondo" perché amo le sfide e ritenevo che il Pi potesse essere in grado di fare di più. Ho iniziato ricompilando la libreria ffmpeg con diversi codec per audio e video da testare. La compilazione della libreria ffmpeg sul Raspberry Pi è sempre stata sconsigliata perché la compilazione di codici può richiedere molto lavoro, ma dalla mia esperienza e se si prende in considerazione il processore quad core del Raspberry Pi 3, è del tutto ragionevole compilare la libreria ffmpeg localmente con molte opzioni. Se decidete di compilare localmente, non vi serviranno ore, ma il tempo sufficiente per andarvi a prendere una tazza di caffè e fare due chiacchiere con qualcuno. Assicuratevi di usare il comando "make -j4" per sfruttare appieno i quattro core del Pi o la vostra attesa sarà un bel po' più lunga.
Il mio momento "eureka" finale è arrivato in un tardo giovedì notte accompagnato da caffeina e buona musica. Il problema più grande che avevo sul Pi era un potenza limitata impiegata a cercare di convertire il mio video stream in ingresso in qualcosa che ritenevo fosse più utilizzabile. La fotocamera stava trasmettendo un video grezzo che il Pi stava trasformando nel più comune mpeg4. Questa transcodificazione stava mettendo a dura prova la potenza del processore e l'ampiezza di banda per l'archiviazione e la memoria. Esiste una soluzione per il problema dell'input di dati grezzi con la C920. La C920 ha un encoder integrato dedicato in grado di emettere uno stream codificato h.264. H.264 è un altro formato video comune, e sebbene mi avvicini molto di più a ciò che voglio, la transcodificazione avrebbe comunque ridotto i miei fotogrammi video al secondo.
Dopo aver capito che la fotocamera mi avrebbe dato il formato h.264 senza alcun lavoro aggiuntivo, ho scoperto anche che per il lab stream, YouTube è in grado di accettare uno stream h.264 senza che io debba manipolarlo. Dovevo ancora modificare leggermente l'audio, ma quello non avrebbe avuto effetti sul Pi. Dopo essere riuscito a caricare lo stream h.264, mi stavo guardando su YouTube a 1080p a una velocità costante di 30 fotogrammi al secondo ed ero al settimo cielo.
Qui sotto è riportato il mio comando set finale impostato nella libreria ffmpeg per offrirvi un punto di partenza per le vostre avventure.
ffmpeg -ar 44100 -ac 2 -f alsa -i hw:1,0 -f v4l2 -codec:v h264 -framerate 30 -video_size 1920x1080 -itsoffset 0.5 -i /dev/video0 -copyinkf -codec:v copy -codec:a aac -ab 128k -g 10 -f flv rtmp://a.rtmp.youtube.com/live2/(Your Stream Key Here)
Il comando soprastante mi ha fornito uno stream 1080p 30fps con audio dalla mia webcam USB su YouTube. Per renderlo perfetto sono necessarie ancora molte rifiniture visto che YouTube continua a segnalarmi che i miei fotogrammi chiave non sono corretti, ma è difficile lamentarsi dei risultati e alla fine funziona.
Ora che posso registrare davvero video 1080p 30fps, credo che registrerò almeno alcuni dei feed che mi servono per il nostro progetto di imaging 3D. Il video h.264 può essere convertito in MPEG4 dopo essere stato registrato usando MP4Box sul Pi, fornendo al nostro software di analisi qualcosa che può suddividere in fotogrammi singoli per l'analisi.
Dunque avete capito, il Raspberry Pi 3 ha una potenza sufficiente a trasmettere effettivamente in streaming un video ad alta definizione su YouTube, dovete solo assicurarvi che la videocamera che intendete usare fornisca uno stream codificato. Il Pi non ha proprio tutto ciò che serve per convertire il video 1080p in tempo reale, ma con le scelte giuste e un po' di ricerche può riuscire a fare un buon lavoro. Non vedo l'ora di vedere cosa riuscirete a realizzare con questi consigli e spero che avrete tutti modo di vedere il nostro lab stream con ospiti speciali quando creeremo i nostri prossimi bellissimi progetti.