====== Convertir une vidéo 3gp/amr en mpeg4/aac ====== ===== Cas d'utilisation ===== J'ai reçu une vidéo via MMS au format //3gp//. Je souhaite la visionner sur mon ordi. La vidéo contient un flux audio au format //amr//. ===== Contenu du fichier ===== $ ffprobe mon-fichier.3gp … Metadata: major_brand : 3gp5 minor_version : 256 compatible_brands: isom3gp53gp4 creation_time : 2025-12-09T10:40:25.000000Z Duration: 00:00:42.05, start: 0.000000, bitrate: 73 kb/s Stream #0:0[0x1](und): Audio: amr_nb (samr / 0x726D6173), 8000 Hz, mono, fltp, 12 kb/s (default) Metadata: creation_time : 2025-12-09T10:40:25.000000Z handler_name : Core Media Audio vendor_id : [0][0][0][0] Stream #0:1[0x2](und): Video: h263 (s263 / 0x33363273), yuv420p, 176x144 [SAR 12:11 DAR 4:3], 59 kb/s, 10 fps, 10 tbr, 600 tbn (default) ===== Lecture ===== Dans mon cas, la lecture sur ordi du fichier 3gp restitue bien la vidéo mais **le son est massacré**, le rendant inaudible. Je décide convertir le fichier vers un format que mon ordi lit correctement. ===== Conversion ===== Je n'ai pas trouvé le moyen de tout faire en une seule commande :-\ Je procède en 3 étapes : - extraction de la piste vidéo seule - extraction de la piste audio seule - assemblage des deux pistes ==== Prérequis ==== //ffmpeg// doit être installé et doté d'un codec //amr//. Sur Debian 12, les paquetages de codecs suivants sont installés : * //libavcodec-extra//((Pour des raisons de licence, //libavcodec// ne contient pas de codec amr.)), * //libopencore-amrnb0//, * //libopencore-amrwb0//. ==== Conversion ==== Extraction vidéo :ffmpeg -i mon-fichier.3gp -an -vcodec copy mon-fichier-video.3gp Extraction audio :ffmpeg -i mon-fichier.3gp -map 0:a -acodec copy mon-fichier-audio.amr Combinaison audio et vidéo :ffmpeg -i mon-fichier-video.3gp -i mon-fichier-audio.amr mon-fichier.mp4 Rotation sans réencodage (si besoin) :ffmpeg -i mon-fichier.mp4 -map_metadata 0 -metadata:s:v rotate="90" -codec copy mon-fichier-mod.mp4 === Script === Un script de conversion (sans rotation) permet de simplifier l'opération. 3gp2mp4.sh mon-fichier.3gp #!/bin/bash # Convertit un fichier 3gp/amr en mpeg4/aac # Fonctionne en chemin absolu ou relatif et depuis un script # Utilisation : 3gp2mp4 ( | ) repertoire="$(dirname "$1")" radical="$(basename "$1")" root=${radical%.*} ext=${radical#"$root"} ffmpeg -i $1 -an -vcodec copy "$repertoire/${root}-video${ext}" ffmpeg -i $1 -map 0:a -acodec copy "$repertoire/${root}-video.amr" ffmpeg -i "$repertoire/${root}-video${ext}" -i "$repertoire/${root}-video.amr" "$repertoire/${root}.mp4" rm "$repertoire/${root}-video${ext}" "$repertoire/${root}-video.amr" ===== Résultat ===== Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 encoder : Lavf59.27.100 Duration: 00:00:42.10, start: 0.000000, bitrate: 80 kb/s Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 176x144 [SAR 12:11 DAR 4:3], 40 kb/s, 10 fps, 10 tbr, 10240 tbn (default) Metadata: handler_name : Core Media Video vendor_id : [0][0][0][0] encoder : Lavc59.37.100 libx264 Side data: displaymatrix: rotation of 90.00 degrees Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 8000 Hz, mono, fltp, 38 kb/s (default) Metadata: handler_name : SoundHandler vendor_id : [0][0][0][0] ===== Ce qui n'a pas fonctionné ===== La commande typique pour convertir le fichier en //mpeg4// / //mp3// encapsulé dans un conteneur //avi// est la suivante : ffmpeg -i mon-fichier.3gp -vcodec mpeg4 -acodec mp3 movie.avi La vidéo convertie est exploitable mais le son est toujours inutilisable (il produit d'autres bruits qu'en la lecture au format natif). Diverses tentatives d'extraction-conversion du son seul donnent également des résultats inexploitables. ffmpeg -i mon-fichier.3gp -ar 22050 mon-fichier.mp3 ffmpeg -i mon-fichier.3gp -ar 8000 mon-fichier.mp3 ffmpeg -i mon-fichier.3gp -ar 44100 mon-fichier.wav