210 votes

Utiliser ffmpeg pour ajouter des sous-titres textuels

J'essaie d'ajouter des sous-titres textuels à un conteneur .mp4 en utilisant ffmpeg :

ffmpeg -i input.mp4 -i input.srt -map 0.0 -map 0.1 -map 1.0 output.mp4

Lorsque j'essaie d'exécuter cette ligne, j'obtiens une erreur :

Le nombre de cartes de flux doit correspondre au nombre de flux de sortie.

Si j'essaie de changer le mp4 en mkv (bien que le mp4 supporte les sous-titres texte), comme ceci :

ffmpeg -i input.mp4 -i input.srt -map 0.0 -map 0.1 -map 1.0 output.mkv

Il mappe correctement les flux, mais donne une erreur :

Encodeur (codec id 94210) non trouvé pour le flux de sortie #0.2

Quand je lance

ffmpeg -codecs

Je vois que le codec srt est pris en charge comme décodeur et encodeur, mais je ne suis pas sûr de ce qui est utilisé pour l'encodage des sous-sous mp4 et mkv, et si je dois l'activer ou le compiler séparément.

7voto

Derrick Coetzee Points 1912

J'ai essayé d'utiliser MP4Box pour cette tâche, mais il ne pouvait pas gérer le M4V avec lequel je travaillais. J'ai réussi à intégrer les SRT en tant que sous-titres logiciels avec ffmpeg en utilisant la ligne de commande suivante :

ffmpeg -i input.m4v -i input.srt -vcodec copy -acodec copy -scodec copy -map 0:0 -map 0:1 -map 1:0 -y output.mkv

Comme vous, j'ai dû utiliser un fichier de sortie MKV - je n'ai pas été capable de créer un fichier M4V.

6voto

cdlvcdlv Points 342

Je vais vous donner une réponse simple et générale qui fonctionne avec n'importe quel nombre d'audios et de vidéos. srt sous-titres y respecte les métadonnées qui peuvent inclure le mkv conteneur. Ainsi, il ajoutera même les images que le matroska peut inclure comme pièces jointes (mais pas d'autres types AFAIK) et les convertira en pistes ; vous ne pourrez pas les regarder mais elles seront là (vous pouvez les démuxer). Ah, et si le mkv a chapitres le mp4 aussi.

ffmpeg -i <mkv-input> -c copy -map 0 -c:s mov_text <mp4-output>

Comme vous pouvez le voir, tout tourne autour de la -map 0 qui dit FFmpeg pour ajouter toutes les pistes, ce qui inclut les métadonnées, les chapitres, les pièces jointes, etc. S'il y a une "piste" non reconnue ( mkv permet d'attacher cualquier type de fichier), elle se terminera par une erreur.

Vous pouvez créer un simple lot mkv2mp4.bat si vous le faites habituellement, pour créer une mp4 avec le même nom que le mkv . Ce serait mieux avec un contrôle d'erreur, un nom de sortie différent, etc. mais vous avez compris.

@ffmpeg -i %1 -c copy -map 0 -c:s mov_text "%~n1.mp4"

Maintenant, vous pouvez simplement exécuter

mkv2mp4 "Video with subtitles etc.mkv"

Et il créera "Vidéo avec sous-titres etc.mp4" avec le maximum d'informations incluses.

0 votes

Merci, votre réponse est très utile

-2voto

Daniel Gianni Points 1

Exemple simple :

videoSource=test.mp4
videoEncoded=test2.mp4
videoSubtitle=test.srt
videoFontSize=24
ffmpeg -i "$videoSource" -vf subtitles="$videoSubtitle":force_style='Fontsize="$videoFontSize"' "$videoEncoded"

Remplacer seulement les variables linux

2 votes

Vous pouvez développer ?

-6voto

Corley Kinnane Points 7

C'est la raison pour laquelle le mkv est un si bon conteneur, surtout maintenant qu'il est mature :

mkvmerge -o output.mkv video.mp4 subtitle.srt

9 votes

Pouvez-vous expliquer pourquoi votre approche résoudrait le problème du PO ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X