Les versions de ffmpeg présentes dans l'écrasante majorité des distributions actuelles ne sont pas compilées avec le support d'AMR, le format audio à intégrer aux vidéos 3gp : il est propriétaire. Pour continuer, nous allons donc devoir l' installer nous-même avec les codecs AMR. Nous n'allons créer aucun conflit, en l'installant dans /opt... Ainsi, nous conserverons en parallèle la version officielle de ffmpeg qui restera utilisable grâce à la commande ffmpeg.
Créons un répertoire ffmpeg-svn :
cd mkdir ffmpeg-svn cd ffmpeg-svn
On récupère la version du svn :
svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk
On télécharge et prépare les codecs appropriés :
wget http://www.3gpp.org/ftp/Specs/archive/26_series/26.073/26073-510.zip mkdir trunk/libavcodec/amr/ unzip 26073-510.zip -d trunk/libavcodec/amr/ cd trunk
Il nous faut d'abord éditer le fichier trunk/libavcodec/amr/makefile pour l'adapter à nos besoins. Trouvez la ligne CFLAGS = ..., et remplacez la par celle-ci : CFLAGS = -Wall -I. $(CFLAGS_$(MODE)) -D$(VAD) -DMMS_IO.
Le codec souffre d'un bug qui va nous empêcher d'aller plus loin, que nous allons devoir corriger :
Éditez le fichier trunk/libavcodec/amr/sp_enc.c, effacez la ligne 22 (const char...) et déplacez l'#include de la ligne ligne 21 à la fin du bloc des inclusions (INCLUDE FILES), juse après le #endif. Au final, notre fichier sp_enc.c ressemble à ça.
Une fois les corrections appliquées, on lance la configuration et l'installation :
./configure --prefix=/opt/ffmpeg --enable-vorbis --enable-libgsm --enable-a52bin --enable-shared --enable-amr_nb-fixed --enable-gpl --enable-memalign-hack
Vous pouvez rajouter des options, parmi celles proposées dans ./configure --help... Mais à vos risques et périls. Celles-ci fonctionnent parfaitement et suffisent à notre utilisation.
LC_ALL=C make su make install
Si tout s'est bien déroulé, vous pouvez maintenant transformer vos vidéos en 3gp ! On extrait d'abord le flux vidéo et on le convertit au bon format (176*144 avec 12 images par seconde) avec mencoder :
mencoder FICHIERDENTREE -nosound -ovc lavc -lavcopts vcodec=mpeg4 -vop expand=176:144,scale=176:-2 -o sortie.avi -ofps 12
On sort la bande son (qui sera placée dans audiodump.wav) en lui donnant 4 décibels de plus pour qu'elle soit bien audible :
mplayer -vo null -ao pcm -af resample=8000,volume=+4db:sc FICHIERDENTREE
Et on assemble les deux au bon format, avec notre version de ffmpeg :
/opt/ffmpeg/bin/ffmpeg -i sortie.avi -i audiodump.wav -b 48 -ac 1 -ab 12 -map 0.0 -map 1.0 video.3gp
Il existe une autre méthode, utilisant directement ffmpeg. Elle a l'avantage d'être plus simple et plus rapide, mais, à qualité équivalente, donne un fichier plus lourd :
/opt/ffmpeg/bin/ffmpeg -i FICHIERDENTREE -acodec amr_nb -s 176x144 -ar 8000 -b 80 -vcodec h263 -ac 1 video.3gp
Cette technique ne gère que les vidéos d'entrée aux formats avec lesquels vous avez compilés ffmpeg... En utilisant mplayer, vous pourrez convertir un plus large panel de formats.
La conversion est aussi réalisable via le script bash fait maison video23gp (version 0.1, à rendre exécutable avec chmod +x video23gp.sh), en utilisant ./video23gp.sh --e video-entree.avi --s video-sortie.3gp. Pour plus d'infos sur le script, ./video23gp.sh --help
Vous pouvez lire votre nouvelle vidéo sur l'ordinateur. Si vous n'entendez pas de son, n'ayez crainte, les codecs sont mal utilisés... une fois sur votre téléphone mobile, elle sera parfaitement jouée.
Merci de rapporter bugs et remarques sur la méthode comme sur le script :-)



