Si vous avez un téléphone portable lisant exclusivement des vidéos 3gp et que vous désirez convertir une séquence à ce format à partir d’un encodage plus standard (DivX, Windows Media Player, …) en utilisant Linux, il n’est pas facile de trouver le bon chemin. Voici un didactitiel qui vous permettra de faire fonctionner ffmpeg correctement pour obtenir un bon résultat, accompagné d’un script bash pour réaliser facilement la conversion !
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 :-)
Yoshitsune le 05 août 2006
Bonjour,
lorsque je fais:
./configure --prefix=/opt/ffmpeg --enable-vorbis --enable-libgsm --enable-a52bin --enable-shared --enable-amr_nb-fixed --enable-gpl --enable-memalign-hack
ca me renvoi cette erreur: @@libogg must be enabled to enable Vorbis. ERROR: libgsm not found If you think configure made a mistake, make sure you are using the latest version from SVN. If the latest version fails, report the problem to the ffmpeg-devel@mplayerhq.hu mailing list or IRC #ffmpeg on irc.freenode.net. Include the log file “config.err” produced by configure as this will help solving the problem.@@
Pouvez vous m’aider?
Baptiste le 12 août 2006
Yoshitune, visiblement tu n’as pas la librairie libgsm… Installe-là via apt-get install libgsm1. Ensuite, je pense que tout fonctionnera.
kwizart, effectivement, les codecs AMR ne sont pas libres (c’est entre autre pour ça qu’ils ne sont pas présents par défaut et si difficiles à installer). Reste à voir si il y a une incompabilité de license… mais je pense que c’est le cas… Sinon, aucun problème pour intégrer le script, il est libre ;-)
key2 le 24 août 2006
N’est il pas normal que la deuxieme methode sorte des fichier 3GP plusvolumineux etant donne qu’avec la premiere methode, on encode au format mpeg4 et avec la deuxieme methode, en h263 (qui est d ailleur supporte par plus de portable 3g que le mpeg4)
Baptiste le 24 août 2006
Tu dois tout bêtement avoir raison, key2. Je n’ai pas fait attention, et effectivement, si on encode les deux vidéos en h263, la différence se réduira sûrement…
NiveK le 03 octobre 2006
Le “configure” plante en indiquant que libgsm est introuvable. Pourtant la lib est presente car j’ai fait un apt-get install libgsm1
du coup… :(
Baptiste le 04 octobre 2006
As-tu installé le paquet libgsm1-dev - ou quelque chose de ce genre - ? Si oui, je suis navré de ne pas avoir d’idée…
Speed47 le 02 décembre 2006
NiveK : j’ai le même problème. En fait le gsm.h n’est pas (sur ma distro) installé directement dans /usr/include. Pour pouvoir compiler, j’ai dû rajouter à la fin de la ligne de commande de ./configure : —extra-cflags=-I/usr/include/gsm Car c’est là que se trouve mon gsm.h :)
Gab le 12 décembre 2006
Un autre script pour convertir, inspiré directement de tes commandes. J’ai trouvé ton script un peu trop … compliqué pour mon usage :)
#!/bin/bash
if [ $# -lt 2 ]
then
echo "$0 <fichier d'entrée> <fichier de sortie>"
exit
fi
ffmpeg=/usr/local/bin/ffmpeg
size='176:144'
#size='352:288'
video=`mktemp -t 3gp.vid.XXXXXXX`
son=`mktemp -t 3gp.son.XXXXXXX`
echo "* Encodage de la vidéo ($video)"
mencoder "$1" -nosound -ovc lavc -lavcopts vcodec=mpeg4 -vop expand=$size,scale=`echo $size | cut -d ':' -f 1`:-2 -o $video -ofps 12 > /dev/null 2>&1
echo "* Encodage du son ($son)"
mplayer -vo null -ao pcm:file=$son -af resample=8000,volume=+4db:sc "$1" > /dev/null 2>&1
echo "* Collage des deux ($2)"
if [ `stat -c '%s' $son` -ne 0 ]
then
$ffmpeg -i $video -i $son -y -ac 1 -ab 12 -map 0.0 -map 1.0 "$2"
else
echo "! Vidéo sans son !"
$ffmpeg -i $video -y "$2"
fi
rm $son $videoGuiohm! le 29 décembre 2006
Moi j’ai quand même un petit soucis qui on dirait viens du son…
root@guiohm-desktop:~# ./encode3gp /dl/Films/Groland/Groland.avi Groland.3gp
FFmpeg version SVN-rUNKNOWN, Copyright (c) 2000-2004 Fabrice Bellard
configuration: --enable-gpl --enable-pp --enable-pthreads --enable-vorbis --enable-libogg --enable-a52 --enable-dts --enable-libgsm --enable-dc1394 --disable-debug --enable-shared --prefix=/usr libavutil version: 0d.49.0.0 libavcodec version: 0d.51.11.0 libavformat version: 0d.50.5.0 built on Sep 20 2006 00:26:15, gcc: 4.1.2 20060906 (prerelease) (Ubuntu 4.1.1-13ubuntu2)
Input #0, avi, from ‘/tmp/3gp.vid.CP27682’:
Duration: 00:17:48.5, start: 0.000000, bitrate: 656 kb/s Stream #0.0: Video: mpeg4, yuv420p, 352x288, 12.00 fps(r)
Input #1, wav, from ‘/tmp/3gp.son.kS27683’:
Duration: 00:17:48.4, start: 0.000000, bitrate: 256 kb/s Stream #1.0: Audio: pcm_s16le, 8000 Hz, stereo, 256 kb/s
Output #0, 3gp, to ‘Groland.3gp’:
Stream #0.0: Video: h263, yuv420p, 352x288, q=2-31, 200 kb/s, 12.00 fps(c) Stream #0.1: Audio: 0x0000, 8000 Hz, mono, 12 kb/s
Stream mapping:
Stream #0.0 -> #0.0 Stream #1.0 -> #0.1
Unsupported codec for output stream #0.1
J’ai utilisé le script.
YaTchi le 29 décembre 2006
Repost…
Soucis d’encodage son. Dans le tuto plus haut il y’a le ./configure que je ne peux pas faire.
Output #0, 3gp, to ‘groland.3gp’:
Stream #0.0: Video: h263, yuv420p, 352x288, q=2-31, 200 kb/s, 12.00 fps(c) Stream #0.1: Audio: 0x0000, 8000 Hz, mono, 12 kb/s
Unsupported codec for output stream #0.1
Voilà, j’ai tout installé, copié le script, et j’ai cette erreur à la sortie de l’encodage des 2 fichiers quand ils doivent être réassemblés. Je suis sous Ubuntu 6.10 Edgy.
Merci.
Baptiste le 31 décembre 2006
Et vous avez essayé avec le premier script (celui dans le billet, pas celui de Gab) ?
YaTchi le 01 janvier 2007
Oui, cela fait pareil. Je doit avoir un soucis ak ffmpeg, jvais creuser par la.
YaTchi le 03 janvier 2007
Oui, j’ai essayé aussi. Même problème.
BSDManiak le 23 février 2007
J’ai eu le même problème que YaTchi et selon la version de ffmpeg il demande différente version de l’archive de ffmpeg il faut voir ce que te dis le ./configure et prendre la bonne archive.
synthgab le 08 mars 2007
Moi j’inverse tes deux filtres lors du réencodage de la video avec mencoder, pour gérer efficacement les aspect-ratio non standards:
-vf scale=176:-2,expand=176:144
D’abord, on le resize à 176xXXX et ensuite on ajoute des bandes noires si nécessaire.
alxgomz le 11 mars 2007
Merci super tuto (surtout la modif des source du codec arm ;)) Enfin une application pratique bien sexy pour ffmpeg/Linux! :) je vais pouvoir faire le malin avec mes videos sur ma micro SD de portable :)
rage le 06 avril 2007
Moi, j’ai un prob avec libogg, j’ai essayé: —extra-cflags=-I/usr/include/ogg Mais sans succès. Domage, ca paraissait sympa
Kuzco le 17 mai 2007
Bonjour j’aurais voulu savoir si il fallait que l’archive qui contient makefile soit dézippé pour pouvoir editer le fichier et si vi était le bon logiciel à utiliser pour editer. merci
JoG le 06 juin 2007
j’ai un petit souci, le fichier make.mak n’existe pas lorsque je lance LC_ALL=C make … comment faire?
Ayasei le 07 août 2007
Salut à tous !
Pourquoi ne pas utiliser avidemux plus simplement? (ou j’ai zappé quelque chose, dans ce cas excusez-moi, je sortirai…MDR)
À plus
sony le 20 août 2007
Bonjour,
Je n’arrive pas a compiler ffmpeg avec l’opttion enable-amr_nb-fixed (unknown option). Avec configure help, je vois les options suivants —enable-libamr-nb et enable-libamr-wb seulement. Je peux compiler ffmpeg avec celles-ci. Mais quand je fais la conversion avec votre command (contenant -acodec amr-nb), je vois a nouveau unkonwn codec. Comment est-ce que je dois faire?
Merci
Le Saueur le 03 septembre 2007
Bonjour Sony, Moi j’ai essaye avec ceci:
./ffmpeg -i <input> -ar 8000 -ab 7.95k -b 80 <output>.3gp
et ca marche (a condition d’avoir compile FFMPEG avec l’AMR:
FFmpeg version SVN-r10287, Copyright (c) 2000-2007 Fabrice Bellard, et al.
configuration: --enable-libmp3lame --enable-libamr-nb libavutil version: 49.5.0 libavcodec version: 51.42.0 libavformat version: 51.12.2 built on Sep 3 2007 12:25:56, gcc: 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
Et patche le fichier libavcodec/mpegaudiodec.c
en rajoutant
Note: Je suis sous Cygwin Linux n’en a peut-etre pas besoin
joanluc le 27 septembre 2007
Adishatz
J’ai suivi cette procédure mais j’ai déjà un problème avec le /configure qui n’accepte pas les options prefix=/opt/ffmpeg enable-vorbis enable-libgsm enable-a52bin enable-shared enable-amr_nb-fixed enable-gpl enable-memalign-hack--enable-vorbis, --enable-a52bin et --enable-amr_nb-fixed.
Y a-t’il des modifications à apporter sur le configure fourni comme sur le makefile ?
mari le 06 décembre 2007
Hello, j’ai un p’tit probleme avec le script
FFmpeg version SVN-rUNKNOWN, Copyright (c) 2000-2007 Fabrice Bellard, et al.
configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-static --enable-shared --cc=x86_64-pc-linux-gnu-gcc --disable-altivec --disable-debug --disable-audio-oss --disable-v4l --disable-v4l2 --disable-dv1394 --disable-network --disable-opts --enable-libmp3lame --enable-libvorbis --enable-libogg --enable-libtheora --enable-libogg --enable-liba52 --enable-libxvid --enable-x11grab --enable-libogg --enable-libx264 --enable-libfaad --enable-libfaac --enable-libamr-nb --enable-libamr-wb --enable-gpl --enable-pp --enable-swscaler --disable-strip libavutil version: 49.4.0 libavcodec version: 51.40.4 libavformat version: 51.12.1 built on Sep 30 2007 23:12:21, gcc: 4.1.2 (Gentoo 4.1.2 p1.0.1)
Input #0, avi, from ‘sortie.avi’:
Duration: 00:07:59.9, start: 0.000000, bitrate: 176 kb/s Stream #0.0: Video: mpeg4, yuv420p, 176x132, 12.00 fps(r)
Input #1, wav, from ‘audiodump.wav’:
Duration: 00:07:59.9, start: 0.000000, bitrate: 256 kb/s Stream #1.0: Audio: pcm_s16le, 8000 Hz, stereo, 256 kb/s
Output #0, 3gp, to ‘a.3gp’:
Stream #0.0: Video: h263, yuv420p, 176x132, q=2-31, 0 kb/s, 12.00 fps(c) Stream #0.1: Audio: libamr_nb, 8000 Hz, mono, 0 kb/s
Stream mapping:
Stream #0.0 -> #0.0 Stream #1.0 -> #0.1
h263 @ 0x2aeee1d2bcb0The specified picture size of 176x132 is not valid for the H.263 codec. Valid sizes are 128x96, 176x144, 352x288, 704x576, and 1408x1152. Try H.263+. Error while opening codec for output stream #0.0 - maybe incorrect parameters such as bit_rate, rate, width or height Success! Video has been converted in 3gp format! http://www.aozeo.com/
kwizart le 10 août 2006
Bonjour! J’ai réussi à compiler une version ffmpeg avec support amr pour Fedora Core 5. Je me suis appuyé sur un rpm source disponible sur livna. Tout marche bien. Je proposerai une mise à jour du package Livna - si rien ne s’y oppose (License des codec?)
Les fichiers diff voire spec sont disponibles ici
Peut être intégrer ton script au package (modification du path ffmpeg /usr/bin/ffmpeg) Si tu es ok?
Par contre la compilation x86_64 voire pcc ne marche pas : discution ici
Merci de me contacter si quelqu’un sait quelles modifications apporter!