web-dev-qa-db-fra.com

Comment supprimer une piste audio d'un fichier vidéo mp4?

J'ai un fichier vidéo mp4 avec plusieurs pistes audio. Je voudrais supprimer le reste des pistes et n'en garder qu'une seule. Comment puis-je faire cela?

107
tshepang

Première exécution ffmpeg -i file.mp4 pour voir quels flux existent dans votre fichier. Vous devriez voir quelque chose comme ceci:

Stream #0.0: Video: mpeg4, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 23.98 tbr, 23.98 tbn, 23.98 tbc
Stream #0.1: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s
Stream #0.2: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s

Exécutez ensuite ffmpeg -i file.mp4 -map 0:0 -map 0:2 -acodec copy -vcodec copy new_file.mp4 pour copier le flux vidéo et le deuxième flux audio vers new_file.mp4.

122
gelraen

Problème associé - suppression tout les pistes audio d'un fichier mp4 peuvent se faire ainsi:

ffmpeg -i input_file.mp4 -vcodec copy -an output_file.mp4
106
Greg Marks

Identifiez les numéros de flux:

$ ffmpeg -i in.mp4
   ...
   Stream #0:0: Video: ...
   Stream #0:1: Audio: ...
   Stream #0:2: Audio: ...

Utilisation -map _file_:_stream_ pour sélectionner les flux à traiter et à produire

$ ffmpeg -i in.mp4 -map 0:0 -map 0:2 -vcodec copy -acodec copy out.mp4

voir: https://ffmpeg.org/ffmpeg.html#Advanced-options

8
jgr

Vous pouvez essayer avidemux qui ne gère qu'un seul fichier audio en interne (et vous oblige donc à sélectionner une piste spécifique). Je ne l'ai jamais essayé avec .mp4 mais cela fonctionne avec d'autres formats.

4
wag

J'ai utilisé Avidemux (GUI) plusieurs fois, et ffmpeg (console).

Dans Avidemux, vous choisissez "Audio" -> "Sélectionner les pistes" dans le menu principal; puis enregistrez votre vidéo dans un nouveau fichier.

Chose intéressante, dans certains cas, Avidemux a produit une "meilleure" sortie que ffmpeg.

juste au cas où, Avidemux et ffmpeg sont dans le référentiel standard de Fedora Linux. (Je suis sûr qu'ils sont également standard dans d'autres versions de Linux.)

3
Maxim

-vn ou -an supprimera toutes les pistes vidéo ou audio. Fourniture -vn -acodec copy supprimera la vidéo; -an -vcodec copy supprimera tout l'audio.

-vcodec copy spécifie que ffmpeg doit faire une copie directe de la piste vidéo existante (et ne pas effectuer de traitement/encodage). Si vous ne le spécifiez pas, cela fonctionnera toujours mais ffmpeg peut ré-encoder la piste vidéo existante et l'opération utilisera plus de CPU et peut prendre beaucoup plus de temps.

1
lots of crisps

Le programme ffmpeg a été remplacé par avconv. avconv a une utilisation très similaire à ffmpeg, donc toutes les commandes de ce message peuvent ressembler à:

avconv <old ffpmeg command line options>

Suivez ce lien pour installer avconv si vous êtes sur Ubuntu.

0
SmallChess

Utilisation d'avidemux en ligne de commande.

(Dans l'interface graphique Avidemux, comme décrit dans https://unix.stackexchange.com/a/85834/4319 ci-dessus, il vous suffit de sélectionner/désélectionner les pistes audio et d'enregistrer le fichier. (Tout est copié vers le nouvel AVI.))

J'ai regardé quel type de projets sont enregistrés en tant que projets SpiderMonkey ou TinyPy pour mes actions, et il s'est avéré que le projet SpiderMonkey (JavaScript) n'a pas les actions de sélection de piste audio dont j'avais besoin, mais le projet TinyPy (Python) avait leur.

J'ai supprimé tout ce qui n'était pas lié (une douzaine de lignes inutiles), et voici ce que j'ai obtenu dans mon some_series.py:

#PY  <- Needed to identify #
#--automatically built--

adm = Avidemux()

adm.audioClearTracks()
adm.audioAddTrack(1)

Il quitte la piste 1, mais laisse tomber la piste 0.

Ensuite, j'ai exécuté une conversion par lots de nombreux fichiers avec une commande comme celle-ci:

for f in *.avi; do avidemux3_cli --nogui --load "$f" --run ../some_series.py --save ../some_series/"${f%%.rus.eng.avi}".eng.avi --quit; done

Il copie tout, mais supprime tout sauf la piste audio nécessaire.

La manière d'exécuter avidemux à partir de la ligne de commande a été apprise par moi https://www.avidemux.org/admWiki/doku.php?id=tutorial:batch_processing , bien qu'ils ne mentionnent pas le = Python, seulement ceux JS (qui ne fonctionnaient pas pour moi).