sabato 20 giugno 2015

Comprimere un file video proveniente da un PVR


Ho acquistato un decoder digitale terrestre che può anche registrare su porta USB.

Una registrazione di un film da 2 ore occupa trai 3,5 e i 4,7 gigabyte, suddivisi in una serie di file .mts da 512 mega ciascuno.
Tipicamente un film videoregistrato lo vedo magari dopo qualche mese (per poi cancellarlo), e tenere occupato tutto quello spazio per così tanto tempo è uno spreco, per cui ho la necessità di comprimere il file video.

Il tempo di compressione vorrei che fosse accettabile (magari non 3 ore, un quarto d'ora già andrebbe bene), la qualità visiva deve essere buona (niente quadrettoni), e il file compresso va bene anche da 1 giga e mezzo (il doppio dei divx che si trovano scaricando film in rete (700)). Parlando senza sapere, probabilmente le mie richieste sono impossibili da soddisfare, per cui bisogna fare un po' di analisi.

Cercando su internet, la maggior parte delle soluzioni proposte funzionano sotto windows, mentre per linux ci sono utility da riga di comando che offrono una gamma di opzioni impressionante, per cui bisogna armarsi di santa pazienza e verificare qual'è la riga di comando e le opzioni più adatte per quello che voglio fare.

Dopo una lunga serie di tentativi, nei quali  problema maggiore è stata una perdita di sincronismo tra audio e video, ho raggiunto questo risultato: eseguendo il seguente comando:

avconv -i "concat:Iris-09032014-2107.mts|Iris-09032014-2107.mts1|Iris-09032014-2107.mts2|Iris-09032014-2107.mts3|Iris-09032014-2107.mts4|Iris-09032014-2107.mts5|Iris-09032014-2107.mts6|Iris-09032014-2107.mts7|Iris-09032014-2107.mts8" -c:v libx264 -strict experimental outputfile.mp4

il tempo impiegato per la codifica è un po' più che un quarto d'ora, diciamo due ore e mezza, e la dimensione del file ottenuto è di circa 2 giga. Il risultato non è proprio il massimo, ma per adesso mi accontento.

Ho anche impostato uno script che prepara automaticamente il comando a partire dai file mts* presenti nella directory e lo esegue:

#/bin/sh

outputFile='outputfile.mp4'

rm -f $outputFile

command='avconv -i "concat:'

for file in $(ls -1X *.mts*); do
 command=${command}$file"|"
done

command=${command}"|"

command=${command/||/\"}

command=${command}" -c:v libx264 -strict experimental "$outputFile

eval $command 
 

La quartultima riga dello script aggiunge un altro carattere 'pipe'(|) alla stringa generata, mentre la terzultima trasforma due caratteri 'pipe' consecutivi in un doppio apice(").