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?
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
.
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
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
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.
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.)
-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.
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.
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).