web-dev-qa-db-fra.com

Extraire tous les fichiers audio et sous-titres d'une vidéo avec ffmpeg

J'ai plusieurs pistes audio et sous-titres à extraire dans un seul fichier .mkv. Je suis nouveau dans les commandes ffmpeg, voici ce que j'ai essayé (audio):

ffmpeg -i VIDEO.mkv -vn -acodec copy AUDIO.aac

Il suffit d'extraire 1 audio. Ce que je veux, c'est dire à ffmpeg d'extraire chaque fichier audio et chaque fichier de sous-titre vers une destination et de conserver le nom d'origine de chaque fichier et extension. (Parce que je ne sais pas quelle est l’extension des fichiers audio, parfois .flac ou .aac

Je ne suis pas sûr des solutions que j'avais trouvées en ligne, car c'est assez compliqué et j'ai besoin d'explications pour savoir comment cela fonctionne et pouvoir manipuler la commande à l'avenir. En passant, j'avais prévu d'exécuter le code à partir de Windows CMD.

Merci.

12
WhatWhereWhen

Il n'y a pas encore d'option dans ffmpeg pour extraire automatiquement tous les flux dans un conteneur approprié, mais il est certainement possible de le faire manuellement. Par défaut sélection de flux _ ne sélectionne qu'un flux par type de flux. Vous devez donc mapper manuellement chaque flux.

1. Obtenir des informations d'entrée

En utilisant ffmpeg ou ffprobe, vous pouvez obtenir les informations dans chaque flux individuel. Il existe un grande variété de formats (xml, json, cvs, etc.) disponible pour répondre à vos besoins.

ffmpeg exemple

ffmpeg -i input.mkv

La sortie résultante (j'ai coupé quelques éléments supplémentaires, les numéros de flux et les informations de format sont ce qui est important):

Input #0, matroska,webm, from 'input.mkv':
  Metadata:
  Duration: 00:00:05.00, start: 0.000000, bitrate: 106 kb/s
    Stream #0:0: Video: h264 (High 4:4:4 Predictive), yuv444p, 320x240 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
    Stream #0:1: Audio: vorbis, 44100 Hz, mono, fltp (default)
    Stream #0:2: Audio: vorbis, 44100 Hz, mono, fltp (default)
    Stream #0:3: Audio: vorbis, 44100 Hz, mono, fltp (default)
    Stream #0:4: Subtitle: ass (default)

ffprobe exemple

ffprobe -v error -show_entries stream=index,codec_name,codec_type input.mkv

Le résultat obtenu:

[STREAM]
index=0
codec_name=h264
codec_type=video
[/STREAM]
[STREAM]
index=1
codec_name=vorbis
codec_type=audio
[/STREAM]
[STREAM]
index=2
codec_name=vorbis
codec_type=audio
[/STREAM]
[STREAM]
index=3
codec_name=vorbis
codec_type=audio
[/STREAM]
[STREAM]
index=4
codec_name=ass
codec_type=subtitle
[/STREAM]

2. Extraire les flux

En utilisant les informations de l'une des commandes ci-dessus:

ffmpeg -i input.mkv \
-map 0:v -c copy video.mkv \
-map 0:a:0 -c copy audio0.oga \
-map 0:a:1 -c copy audio1.oga \
-map 0:a:2 -c copy audio2.oga \
-map 0:s -c copy subtitles.ass

Dans ce cas, l'exemple ci-dessus est le même que:

ffmpeg -i input.mkv \
-map 0:0 -c copy video.mkv \
-map 0:1 -c copy audio0.oga \
-map 0:2 -c copy audio1.oga \
-map 0:3 -c copy audio2.oga \
-map 0:4 -c copy subtitles.ass
28
llogan

Vous devez d’abord répertorier tous les flux audio:

ffmpeg -i VIDEO.mkv

puis, en fonction de la sortie, vous pouvez compiler la commande pour extraire les pistes audio individuellement.

En utilisant un script Shell, vous pouvez potentiellement l’automatiser dans un fichier script afin que vous puissiez le faire de manière générique pour tout fichier mkv.

Les sous-titres sont à peu près les mêmes. Les sous-titres seront imprimés dans les informations et vous pourrez ensuite les extraire, comme suit:

ffmpeg -threads 4 -i VIDEO.mkv -vn -an -codec:s:0.2 srt myLangSubtitle.srt

0.2 est l'identifiant que vous devez lire dans l'info.

2
seba.wagner

Le script suivant extrait tous les flux audio des fichiers du répertoire en cours.

ls |parallel "ffmpeg -i {} 2>&1 |\
 sed -n 's/.*Stream \#\(.\+\)\:\(.\+\)\: Audio\: \([a-zA-Z0-9]\+\).*$/-map \1:\2 -c copy \"{.}.\1\2.\3\"/p' |\
 xargs -n5 ffmpeg -i {} "
0
ivan2kh