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

97

J'ai un fichier vidéo MP4 avec plusieurs pistes audio. J'aimerais enlever le reste des pistes et n'en garder qu'une. Comment puis-je faire cela?

Tshepang
la source
liées: stackoverflow.com/questions/38161697/…
Ciro Santilli 中心 法轮功 六四 事件

Réponses:

111

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

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

Ensuite, lancez ffmpeg -i file.mp4 -map 0:0 -map 0:2 -acodec copy -vcodec copy new_file.mp4pour copier le flux vidéo et le second flux audio new_file.mp4.

Gelraen
la source
3
Sous Windows, cette commande donnait l'erreur Option map (set input stream mapping) cannot be applied to input file file.mp4 new_file.mp4 -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.: pour y remédier, changez simplement l'ordre des arguments de la manière suivante:ffmpeg -i file.mp4 -map 0:0 -map 0:2 -acodec copy -vcodec copy new_file.mp4
MrLore le
Même erreur que @MrLore sur OS X.
Oskar Persson
1
C'est pareil sur Ubuntu!
Tommaso
Fonctionne également au format MKV
user3405291
1
Vous pouvez utiliser l'option plus générique -c copyd'avoir des flux identiques pour l' audio, la vidéo , mais des sous - titres aussi: ffmpeg -i input.mp4 -map 0:0 -map 0:2 -c copy output.mp4.
Futal
97

Problème lié: la suppression de toutes les pistes audio d’un fichier mp4 peut être effectuée ainsi:

ffmpeg -i input_file.mp4 -vcodec copy -an output_file.mp4
Greg Marks
la source
1
Cela me donne l'erreur The encoder 'aac' is experimental but experimental codecs are not enabled, add '-strict -2' if you want to use it.Mais j'ai ajouté ces drapeaux et c'est toujours pareil ...?
Poshaughnessy
Voir aussi: superuser.com/questions/268985/…
Ciro Santilli a eu lieu le 8 septembre à 16h16
Commentaire de re poshaughnessy: il semble y avoir quelques informations ici: stackoverflow.com/questions/32931685/… La discussion suggère que les versions récentes de ffmpeg ne rencontrent pas le problème "expérimental aac". En règle générale, il est utile de diagnostiquer votre problème si vous indiquez la version du logiciel que vous utilisez et la syntaxe exacte de la commande (après avoir ajouté les indicateurs) qui a donné l'erreur (voir la réponse de freeseek, loc. Cit. ). Dans ce cas spécifique, les informations vidéo du fichier d'entrée peuvent également être utiles.
Greg marque le
8

Identifier les numéros de flux:

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

Utilisez -map _file_:_stream_pour sélectionner les flux à traiter et à afficher

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

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

jgr
la source
4

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

remuer
la source
Ça ne marche pas si bien. Peut-être que c'est un bug, mais l'audio revient altéré, bien qu'il fasse le travail (supprime le reste des pistes audio).
Tshepang
3

J'ai utilisé plusieurs fois Avidemux (GUI) 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.

Fait intéressant, 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 standard dans d'autres versions de Linux.)

Maxime
la source
1

-vnou -ansupprimera toutes les pistes vidéo ou audio. La fourniture -vn -acodec copysupprimera la vidéo; -an -vcodec copyva supprimer tout l'audio.

-vcodec copyspécifie que ffmpeg doit faire une copie directe de la piste vidéo existante (et ne faire aucun traitement / encodage de celle-ci). Si vous ne le spécifiez pas, cela fonctionnera toujours, mais ffmpeg pourrait réencoder la piste vidéo existante et l'opération nécessitera davantage de ressources processeur et risque de prendre beaucoup plus de temps.

beaucoup de chips
la source
0

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é dans le nouvel AVI.))

J'ai examiné le type de projets enregistrés en tant que projets SpiderMonkey ou TinyPy pour mes actions. Il s'est avéré que le projet SpiderMonkey (JavaScript) ne comportait pas les actions de sélection de piste audio dont j'avais besoin, mais le projet TinyPy (Python) ne l'avait pas. leur.

J'ai tout supprimé (une douzaine de lignes inutiles), et voici ce que j'ai 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 à l' adresse https://www.avidemux.org/admWiki/doku.php?id=tutorial:batch_processing , bien qu'ils ne mentionnent pas les scripts Python, mais uniquement les scripts JS ( qui n'a pas fonctionné pour moi).

imz - Ivan Zakharyaschev
la source
-1

Si cela ne vous dérange pas que le programme soit une interface graphique, avec l' éditeur de vidéo de Blender , vous pouvez le faire et bien plus encore.

YoMismo
la source
-2

Le ffmpegprogramme a été remplacé par avconv. avconva un usage très similaire à ffmpeg, donc toutes les commandes de ce post peuvent être quelque chose comme:

avconv <old ffpmeg command line options>

Suivez ce lien pour installer avconvsi vous êtes sur Ubuntu.

Petitchess
la source
-3

FFMPEG pourrait être une solution utile pour vous.

$ man ffmpeg
koolhead17
la source
J'ai jeté un coup d'oeil, et c'est assez dense. J'ai cherché "audio" et "piste audio" et rien ne semblait évident.
Tshepang
@Tshepang, "track" est ambigu, ce qui explique probablement pourquoi FFmpeg préfère une terminologie plus précise. FFmpeg considère que l'audio intervient en "flux", chacun comprenant un ou plusieurs "canaux". AFAICT, chaque canal est mono, le flux décrivant la ou les sorties vers lesquelles il doit être envoyé (panoramique) par défaut. Par exemple, un flux stéréo est constitué de deux canaux, l'un envoyé par défaut à la sortie de la carte son et l'autre à la sortie droite de la carte son par défaut.
sampablokuper