01.22
Dato il mio ultimo acquisto, di recente ho dovuto forzatamente scontrarmi un po’ col mondo dell’encoding/editing video, andando oltre la semplice transcodifica di cui mi ero già occupato. La mia idea era quella di registrare in digitale gli episodi di Blue Heelers, un orrendo telefilm di poliziotti australiani, trasmesso in Italia dalle reti regionali a orari improponibili, e di cui sono probabilmente l’unico appassionato. Ovviamente, volevo fare il tutto con software libero.
Su come registrare da una scheda TV analogica con GNU/Linux c’è in giro abbastanza materiale. Purtroppo, però, pare che tutti tendano a encodare direttamente in MPEG-4, cosa che non mi piace per tutta una serie di motivi. Innanzitutto, dato che la codifica deve avvenire in tempo reale, non si possono usare i parametri avanzati per aumentare la qualità della compressione. Secondo, voglio poter eliminare la pubblicità e tagliare i bordi neri attorno all’immagine, senza contare che la mia antenna fa abbastanza schifo, e quindi vorrei anche poter passare il tutto in un filtro per l’eliminazione del rumore. Ultimo discorso è il deinterlacciamento, che nella pratica ho trovato essenziale. Non vi spiegherò cos’è, ma in giro troverete molti documenti in merito.
Al solito, chi è interessato legga l’articolo intero.
Premetto che quanto segue può non essere il modo migliore di fare le cose, dato che l’ho messo a punto io senza esperienza sul campo. Per questo, si accettano volentieri commenti e suggerimenti.
Scartando ovviamente l’ipotesi di comprimere al volo in MPEG-4, editare e ricomprimere, e quella di salvare i frame in formato non compresso per comprimere solo dopo l’editing, causa voracità di spazio su disco intrinseca della cosa, serve un formato intermedio che abbia le seguenti caratteristiche:
- Comprima, ma non troppo
- Comprima in realtime
- Non utilizzi frame che dipendono l’uno dall’altro, cosa che renderebbe difficile l’eliminazione della pubblicità
Inizialmente, la mia scelta è caduta sul formato DV, ossia quello utilizzato dalle telecamere digitali. Quanto al programma, come già detto, ho scelto mencoder. Per evitare di dover ricordare a memoria tutti gli switch che ho capito di dover utilizzare, ho sfruttato i profili che mette a disposizione. Ho creato un file .mplayer/mencoder.conf col seguente contenuto:
[rectv] profile-desc="DV recording" ovc=libdv=1 oac=copy=1 tv=driver=v4l2:width=720:height=576:norm=PAL:fps=25:chanlist=europe-west:amode=1:alsa=1:adevice=hw.1,0:audiorate=32000
Vediamo riga per riga:
- rectv: Nome del profilo, che va racchiuso tra parentesi quadre.
- profile-desc="DV recording": Descrizione arbitraria del profilo, che non ho ancora capito quando viene mostrata.
- ovc=libdv=1: Output Video Codec, dice a mencoder di utilizzare il formato DV per l’output.
- oac=copy=1: Output Audio Codec, abbastanza ovvio, fa sì che l’audio sia copiato pari pari come viene ricevuto (PCM) nel file di output.
- tv=...: Parametri per la ricezione della TV. Sono tutti abbastanza ovvi, tranne quelli sull’audio, che dipendono strettamente dalla scheda utilizzata. Nel mio caso, utilizzo il modulo del kernel saa7134_alsa, che crea un dispositivo audio (hw:1,0) dal quale mencoder può leggere l’audio ricevuto dalla scheda.
Ho poi scoperto che la codifica DV è terribilmente pesante, e l’unico modo che avevo per non perdere troppi frame sul mio “misero” Athlon64 3200+ era lanciare mencoder con una priorità piuttosto elevata. Il comando che utilizzavo quindi per registrare era il seguente:
sudo \\
nice -n -5 \\
mencoder -profile rectv tv://2 -o tv.avi
Mentre registravo in questo modo, l’utilizzo della CPU andava oltre il 90%, impedendo l’utilizzo del PC per fare altro contemporaneamente. Nel tentativo di migliorare la situazione, ho chiesto lumi in giro, e Giustino mi ha suggerito di utilizzare il formato Motion JPEG (MJPEG), in cui, in pratica, ogni fotogramma viene compresso come un’immagine JPEG, cosa che su una macchina moderna è relativamente veloce, data anche la risoluzione non elevatissima. Ho quindi creato un nuovo profilo:
[rectvm] profile-desc="MJPEG recording" ovc=lavc=1 lavcopts=vcodec=mjpeg:mbd=2:autoaspect=1:dia=2 oac=copy=1 tv=driver=v4l2:width=720:height=576:norm=PAL:fps=25:chanlist=europe-west:amode=1:alsa=1:adevice=hw.1,0:audiorate=32000
L’unica differenza rispetto al precedente è l’utilizzo del codec lavc, con alcune opzioni (lavcopts) che aumentano la qualità della codifica, su cui non mi soffermo (aggiungo però che trell manda il tutto in un simpatico Segmentation fault).
In questo modo possiamo registrare la TV analogica in un formato digitale mantenendo una certa qualità e senza nessun limite imposto al post-processing. A quale prezzo, però: un’ora di video codificato in MJPEG con audio PCM occupa circa 8,8 GB, mentre in DV circa una volta e mezza: 13 GB.
Nel prossimo articolo vedremo come effettuare il post-processing e convertire il tutto in MPEG-4.
una sola parola: pro-fes-sio-na-le.
Uh! Sono ancora in grado di dividere in sillabe!
O no?