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.
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.
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
exempleffmpeg -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
exempleffprobe -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]
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
Je préfère le premier exemple car le input file index:stream specifier:stream index
est plus flexible et efficace; il est également moins sujet à un mappage incorrect.
Voir la documentation sur spécificateurs de flux et l'option -map
} pour bien comprendre la syntaxe. Des informations supplémentaires se trouvent dans la réponse à problème vidéo et audio de FFmpeg mux (d'une autre vidéo) - mappage }.
Ces exemples vont copier le flux _ (re-mux) afin qu'aucun recodage ne se produise.
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.
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 {} "