Comment supprimer les flux audio d'un fichier MKV?

16

J'ai essayé de supprimer les flux audio inutiles d'un fichier MKV (Matroska). La raison pour laquelle je veux le faire est d'éviter d'avoir à sélectionner manuellement le flux souhaité dans Windows Media Player.

Le fichier d'entrée donne les informations ffmpeg suivantes:

Stream #0.0: Video: mpeg4, yuv420p, 704x396 [PAR 1:1 DAR 16:9], 29.98 tbr, 1k tbn, 29.98 tbc
Stream #0.1(eng): Audio: aac, 24000 Hz, 5.1, s16
Stream #0.2(jpn): Audio: aac, 24000 Hz, 5.1, s16
Stream #0.3(eng): Subtitle: 0x0000
Stream #0.4(eng): Subtitle: 0x0000
Stream #0.5: Attachment: 0x0000
Stream #0.6: Attachment: 0x0000

Puisque je veux les streams 0, 1 et 3 (sub), ma commande ffmpeg ressemble à ceci:

ffmpeg -i input.mkv -map 0:0 -map 0:1 -map 0:3 -vcodec copy -acodec libmp3lame -newsubtitle test.mkv

ce qui donne étrangement l'erreur:

At least one output file must be specified

Suppression des sous-titres:

ffmpeg -i input.mkv -map 0:0 -map 0:1 -vcodec copy -acodec libmp3lame test.mkv

me donne ceci:

Number of stream maps must match number of output streams

Il semble que je ne comprenne pas vraiment comment fonctionne l'option "carte". Quelqu'un pourrait-il m'aider à le comprendre?

StackedCrooked
la source

Réponses:

25

Si tout ce que vous voulez faire est de supprimer un flux, pas de ré-encoder, vous voulez probablement le faire avec le package MKVtoolnix (voir la page de videohelp.com ).

Il existe quelques interfaces graphiques qui peuvent vous aider (consultez le lien vidéohelp). Je ne suis pas sûr de ce que la mkvmergeligne de commande exacte pourrait être, mais je pense que quelque chose comme ça fonctionnerait:

# first, get audio track info so we know which one to keep
mkvmerge -i input.mkv
File 'input.mkv': container: Matroska
Track ID 1: video (V_MPEG4/ISO/AVC)
Track ID 2: audio (A_AAC)
Track ID 3: audio (A_AAC)        <----------- for example, let's keep this one
Track ID 4: audio (A_AAC)

mkvmerge -o output.mkv --atracks 3 input.mkv

Cela devrait faire l'affaire (je n'ai pas de fichier à portée de main pour les tests, désolé). L' --atracksoption indique mkvmergede copier uniquement les pistes audio répertoriées dans le nouveau fichier. Si vous vouliez garder 2 & 3 mais pas 4, vous pouvez utiliser --atracks 2,3.

mkvmergepossède de nombreuses autres options pour définir les titres, ajouter un délai pour synchroniser l'audio, etc., alors consultez la page de manuel pour plus de détails.

Quack Quichotte
la source
5
On dirait que l' --atracksoption n'existe plus, à la place on devrait utiliser soit --audio-tracksou --video-tracks.
malat
0

Essayez -fde forcer le format spécifié:

ffmpeg -i input.mkv -map 0: 0 -map 0: 1 -map 0: 3 -vcodec copy -acodec libmp3lame -newsubtitle -f mkv test.mkv
John T
la source
Cela me donne étrangement l'erreur: "Au moins un fichier de sortie doit être spécifié"
StackedCrooked
essayez d'utiliser un chemin complet, c'est-à-dire: C: \ path \ to \ output.mkv (je suppose que vous êtes sur Windows par la référence du lecteur multimédia)
John T
@John T: l'utilisation du chemin complet (avec ou sans guillemets) me donne toujours le message d'erreur "Au moins un fichier de sortie doit être spécifié".
StackedCrooked
0

Il y a vraiment deux problèmes distincts ici:

  1. Dans la première ligne de commande, l'ordre des paramètres peut être incorrect. Je pense que le -newaudiocommutateur doit être à la fin, après le nom du fichier de sortie.

  2. La deuxième ligne de commande, "Suppression des sous-titres", puisque le fichier d'entrée a des sous-titres, vous devez utiliser le -sncommutateur pour les supprimer. Sinon, il semble que FFmpeg veuille au moins un spécifié dans la -mapliste.

user57355
la source
0

Dans votre première commande, vous n'avez pas spécifié que test.mkv était votre fichier de sortie. On dirait que vous devez changer cette partie pour qu'elle ressemble à quelque chose ... -c copy test.mkvou spécifier le codec comme ... -c:s copy test.mkv.

Et je ne sais pas ce que fait ce -newsubtitledrapeau là-dedans. Mais si vous souhaitez ajouter un fichier de sous-titres, vous devriez pouvoir faire un autre indicateur d'entrée -i input.srt. Regarde ça lien pour cela.

Dans votre deuxième commande, je pense qu'il semble que vous essayez de mapper le flux vidéo et de le copier. Donc, vous voudrez peut-être essayer de supprimer l' -vcodec copyinstruction et cela devrait simplement fonctionner. :)

Chef Pharaon
la source
1
Il n'y a pas de l spécificateur de flux .
llogan