From 3gp to avi and from amr to mp3 with ffmpeg rebuild

Spesso i nostri cellulari sono in grado di registrare file video e audio, il problema è che alcuni cellulari (tutti quelli che ho provato) salvano il file risultante in formato 3gp e amr.

Questi formati per una serie motivi, in primis il codec audio utilizzato ed in seconda battuta per via del container, sono di difficile gestione per un player multimediale normodotato. Risulterebbe quindi interessante convertirli in un più compatibile avi con video in xvid e audio in mp3 nel caso di un video ed in un mp3 nel caso di un file audio.

Compilare ffmpeg con supporto amr

Come spesso accade su questo blog la distribuzione utilizzata è una Ubuntu, la versione di ffmpeg inclusa tuttavia non ha il supporto per decodificare l’audio dei video 3gp generati dai nostri amati/odiati cellulari, è necessario quindi ricompilare ffmpeg per includere questa nuova feature.

Per prima cosa è necessario compilare le librerie per la decodifica dell’audio, è possibile scaricare i sorgenti ai seguenti indirizzi:

Per completezza questa è l’homepage delle AMR Codec Libraries. Una volta scaricati e decompressi gli archivi è necessario compilare le due librerie, per farlo basta eseguire quanto segue:

cd ./amrnb-7.0.0.2/
./configure --prefix=/opt/usr
make -j 2
sudo make install
sudo ln -s /opt/usr/lib/libamrnb.so.3 /usr/lib/libamrnb.so.3
cd ../amrwb-7.0.0.3/
./configure --prefix=/opt/usr
make -j 2
sudo make install
sudo ln -s /opt/usr/lib/libamrwb.so.3 /usr/lib/libamrwb.so.3

Adempiuto ai precedenti task è necessario installare un pò di pacchetti devel per i codec che ci interessa supportare (in questo caso si è aggiunto solo il supporto a lame ed xvid)…

sudo apt-get install liblame-dev libxvidcore4-dev libgsm1-dev libdc1394-13-dev libfaac-dev \
       > libfaad-dev libflac-dev libogg-dev  libraw1394-dev libtheora-dev

Per non avere una versione troppo diversa da quella inclusa nella nostra distribuzione è possibile vedere con che opzioni è stato compilato ffmpeg col seguente comando, andremo poi ad aggiungerle alle opzioni di nostro interesse successivamente…

ffmpeg -version
FFmpeg version SVN-rUNKNOWN, Copyright (c) 2000-2007 Fabrice Bellard, et al.
  configuration: --enable-gpl --enable-pp --enable-swscaler --enable-pthreads --enable-libvorbis --enable-libtheora --enable-libogg --enable-libgsm --enable-dc1394 --disable-debug --enable-shared --prefix=/usr
...

…ed ecco i comandi da digitare per compilare ffmpeg con supporto alla decodifica dei formati amr e codifica xvid ed mp3:

./configure --enable-gpl --enable-postproc --enable-swscale --enable-pthreads --enable-libtheora \
      > --enable-libdc1394 --disable-debug --enable-libxvid --enable-libmp3lame --enable-libgsm \
      > --enable-libamr_nb --enable-libamr_wb --enable-libfaac --enable-libfaad --enable-gpl  --enable-nonfree \
      > --extra-cflags="-I/opt/usr/include" --extra-ldflags="-L/opt/usr/lib" --prefix="/opt/usr"
make -j 2
sudo make install

Ovviamente la coppia parametro/valore -j 2 è utile solo se avete un processore con almeno due core.

From amr to mp3 and from mp3 to amr

Il formato amr viene ottenuto utilizzando come algoritmo di codifica l’Adaptive Multi-Rate Narrow Band (AMR-NB), questo simpatico algoritmo di derivazione telefonica (quindi ottimizzato per la codifica del parlato) viene utilizzato come standard per la codifica dell’audio sia per le registrazioni di audio puro sia per i video.

Questo codec ha però una qualità estremamente bassa, si parla di un sample rate di 8 KHz , bit rate di 12.2 KHz e rigorosamente con un solo canale audio (quindi in mono), in aggiunta i codec per questo tipo di formato sono coperti da brevetti in parecchie nazioni che non rendono liberamente redistribuibile i programmi che lo usano (per questo è necessario ricompilare ffmpeg per avere il supporto).

Con una qualità così bassa già i parametri minimi per un file in formato mp3 sono grasso che cola tuttavia non si può fare altrimenti e dovremo arrenderci al fatto di ottenere un file di dimensioni maggiore all’originale, per una conversione dei file audio con ffmpeg ricompilato come spiegato precedentemente e sufficiente digitare:

/opt/usr/bin/ffmpeg -i ./Desktop/Voice001.amr -f mp3 -acodec libmp3lame -ac 2 -ab 32k -ar 44100 ./Desktop/Voice001.mp3

In questo caso si è passati a 2 canali (quindi da mono a stereo), e si è ri-campionato a 44100 Hz al bit rate minimo per lame, la maggiore dimensione del file in uscita comunque è da imputare al maggiore bit rate gli altri parametri influiscono molto poco.

Nel caso vi interessi il passaggio opposto (cosa da masochisti visto che i cellulari moderni sono in grado di replicare file codificati in mp3 e altri formati con una codifica di qualità decisamente superiore) vi basta dare il comando:

/opt/usr/bin/ffmpeg -i ./Desktop/Adriano-via-gluk.mp3 -f amr -acodec libamr_nb -ac 1 -ar 8000 -ab 12.2k ./Desktop/Adriano-via-gluk.amr

Così otterrete un file audio di dimensione di circa un’ordine di grandezza inferiore (~380KB anzichè ~ 3.6MB) ma anche qualità infinitamente inferiore. A voi la scelta…

From 3gp to avi and from avi to 3gp – single input file

Per iniziare è necessario dare un’occhiata a come è stato codificato il file di origine, per farlo digitare:

/opt/usr/bin/ffplay -stats ./Desktop/noko\ in\ action.3gp
...
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from './Desktop/noko in action.3gp':
  Duration: 00:00:10.04, start: 0.000000, bitrate: 139 kb/s
    Stream #0.0(eng): Video: mpeg4, yuv420p, 176x144 [PAR 1:1 DAR 11:9], 30.00 tb(r)
    Stream #0.1(eng): Audio: libamr_nb, 8000 Hz, mono, s16
  ...

Questo è l’output epurato dalle righe non di nostro interesse, notare i codec utilizzati e il frame rate dello stream video.
Per passare ad xvid/mp3 ora occorre digitare:

/opt/usr/bin/ffmpeg -i ./Desktop/noko\ in\ action.3gp -f avi -acodec libmp3lame -ar 44100 \
        -ac 1 -ab 32000 -r 30 -vcodec libxvid -qscale 6 ./Desktop/noko\ in\ action.avi

In questo caso si è optato per non passare a stereo ricampionando comunque l’audio, il bit rate è stato mantenuto minimo. Il sample rate è stato impostato a 44100Hz per motivi di compatibilità, alcuni player hanno problemi a gestire file mp3 con un sample rate di 8000Hz (cosa comunque che lame vi lascia fare e che mplayer gestisce senza problemi).

Per quanto riguarda il video il flusso è stato ricodificato con xvid utilizzando una scala di quantizzazione fissa tale da non far perdere qualità al video, probabilmente per un video a bassa risoluzione come quello d’esempio sarebbe potuto andare bene pure un valore più elevato, se per caso il vostro cellulare dovesse fare filmati a risoluzioni prossime a 640×480 magari un valore più basso, ad esempio 4 o 2, potrebbe essere più appropriato.

Se per qualche strana ragione volete rovinare un filmato convertendolo a 3gp vi basta digitare quanto segue:

/opt/usr/bin/ffmpeg -i input.avi -f 3gp -s qcif -vcodec h263 -acodec libamr_nb -ac 1 -ar 8000 \
       -r 25 -ab 12.2k outputfile.3gp

From multiple 3gp file to single 3gp or avi file

Inizialmente il mio cellulare era impostato per registrare video fino alla dimensione massima per la trasmissione via mms quindi mi sono ritrovato con una discreta quantità di file relativi ad uno stesso filmato. Non avendo voglia di ricompilare mencoder per poter fare il merge dei file in una singola passata ho optato per questo metodo con passaggi intermedi. Se per caso avete un problema analogo entrate nella directory contenente i file e digitare:

for i in $(ls); do /opt/usr/bin/ffmpeg -i $i -f avi -acodec libmp3lame -ar 8000 -ac 1 -ab 32k -r 30 -vcodec copy ../Video/$i.avi ; done
mencoder -forceidx -oac copy -ovc copy ../Video/Video-011200* -o ../Video/merged.avi
/opt/usr/bin/ffmpeg -i ../Video/merged.avi -f 3gp -vcodec copy -acodec libamr_nb -ab 12.2k -ac 1 -ar 8000 ../Video.3gp

Ovviamente è necessario creare la directory dove verranno salvati i file convertiti nella fase 1. Sostanzialmente si converte l’audio e il container di tutti i file per poterne fare il merge con mencoder nella fase 2. Una volta fatto il merge si provvede a ricodificare l’audio in amr e a cambiare il container nuovamente a 3gp…il gioco è fatto!!!

Nel caso in cui vogliate passare da più file 3gp in ingresso ad un singolo file avi cambia poco rispetto all’esempio precedente, si convertono tutti i file uno per uno ad xvid ed mp3 e poi se ne fa il merge con mencoder.

for i in $(ls); do /opt/usr/bin/ffmpeg -i $i -f avi -acodec libmp3lame -ar 44100 -ac 1 -ab 32k \
      -r 30 -vcodec libxvid -qscale 6 ../Video/$i.avi ; done
mencoder -forceidx -oac copy -ovc copy Video-011200* -o merged.avi

Related post:

Comments are closed.