====== 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