Utilisez ffmpeg pour ajouter des sous-titres de texte [fermé]

122

J'essaie d'ajouter des sous-titres de texte à 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, cela me donne une erreur:

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

Si j'essaie de changer le mp4 en mkv (bien que mp4 prenne en charge les sous-titres de 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) introuvable pour le flux de sortie # 0.2

Quand je lance

ffmpeg -codecs

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

0-alpha
la source

Réponses:

196
ffmpeg -i infile.mp4 -i infile.srt -c copy -c:s mov_text outfile.mp4

-vf subtitles=infile.srt ne fonctionnera pas avec -c copy


L'ordre de -c copy -c:s mov_textest important. Vous dites à FFmpeg:

  1. Vidéo: copie, Audio: copie, Sous-titre: copie
  2. Sous-titre: mov_text

Si vous les inversez, vous dites à FFmpeg:

  1. Sous-titre: mov_text
  2. Vidéo: copie, Audio: copie, Sous-titre: copie

Vous pouvez également utiliser -c:v copy -c:a copy -c:s mov_textdans n'importe quel ordre.

Steven Penny
la source
13
Cette méthode ajoute un sous-titre au fichier comme l'un des flux, il faut donc le support du lecteur pour afficher les sous-titres (tels que VLC)
BollMose
1
Cela signifie-t-il que le sous-titre est disponible, mais pas gravé dans la vidéo? Je peux montrer si je veux sur demande?
dim
3
Oui @ sunk818 c'est ce que cela signifie. Cela ajoute le sous-titre en tant que piste qui peut être activée ou désactivée tant que le lecteur le prend en charge. M. Hyde et Paul ffmpeg peuvent également ajouter les sous-titres au-dessus de la vidéo elle-même, et dans ces cas, vous contrôleriez des choses comme la police et le positionnement.
Boushley
1
Les fichiers .srt doivent être importés avec -c:s copypas avec -c:s mov_text.
GetFree
82

REMARQUE: Cette solution "brûle les sous-titres" dans la vidéo, de sorte que chaque spectateur de la vidéo sera obligé de les voir.

Utilisez la libassbibliothèque (assurez-vous que votre installation ffmpeg a la bibliothèque dans la configuration --enable-libass).

Commencez par convertir les sous-titres au .assformat:

ffmpeg -i subtitles.srt subtitles.ass

Ajoutez-les ensuite à l'aide d'un filtre vidéo:

ffmpeg -i mymovie.mp4 -vf ass=subtitles.ass mysubtitledmovie.mp4
HdN8
la source
40
Cela les "gravera" dans la vidéo, ce qui signifie que vous ne pourrez pas les désactiver dans le lecteur. Ceci est différent de les ajouter en tant que flux de sous-titres qui peut être lu par le lecteur et affiché si le spectateur le souhaite.
stib
1
Merci beaucoup pour cette solution. Est-il possible de spécifier la taille des caractères?
user1319182
1
Jetez un œil à cette réponse: stackoverflow.com/questions/21363334/… . Vous voudrez probablement définir la police dans le fichier de sous-titres lui-même, sinon en utilisant le filtre de sous-titres, vous pouvez forcer_style à définir la police: ffmpeg.org/ffmpeg-filters.html#subtitles-1
HdN8
Cela sera utile lors de l'ajout de sous-titres pour des vidéos quelque part comme Instagram. Quelque part comme la visionneuse Instagram, cet utilisateur n'a pas la capacité d'écouter du son ou une vidéo est dans une autre langue, alors l'utilisateur peut lire le sous-titre à la place
ϻαϻɾΣɀО-MaMrEzO
1
Installez les libassextensions si manquantes sur les systèmes Debian avec `apt update && apt install libass-dev".
Sopalajo de Arrierez
53

Vous essayez de multiplexer les sous-titres en tant que flux de sous-titres. C'est facile mais une syntaxe différente est utilisée pour MP4 (ou M4V) et MKV. Dans les deux cas, vous devez spécifier le codec vidéo et audio, ou simplement copier le flux si vous souhaitez simplement ajouter des sous-titres.

MP4:

ffmpeg -i input.mp4 -f srt -i input.srt \
-map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy \
-c:s mov_text output.mp4

MKV:

ffmpeg -i input.mp4 -f srt -i input.srt \
-map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy \
-c:s srt  output.mkv
dotokija
la source
3
Est-il possible d'ajouter plus d'un sous-titre? Ce softsub sera-t-il reconnu comme langue inconnue?
Patrick
1
Oui, ça l'est. Je viens de le tester pour MKV:
dotokija
7
Ajoutez d'abord une autre entrée: -i input2.srt. Deuxièmement, mappez cela comme 2ème flux: -map 2: 0. Enfin, sélectionnez l'encodeur pour le 2ème flux de sous-titres (le même que le premier): -c: s srt. L'exemple complet \ ffmpeg -i input.mp4 -f srt -i input.srt -i input2.srt \ -map 0: 0 -map 0: 1 -map 1: 0 -map 2: 0 -c: v copie - c: une copie \ -c: s srt -c: s srt output.mkv
dotokija
8
Et pour ajouter des métadonnées de langue (insérer avant le fichier de sortie) "-metadata: s: s: 0 language = eng"
Patrick
comment se fait-il que les sous-titres du fichier d'origine soient exclus lorsque je "remballe" les fichiers mkv en tant que fichiers mp4 (ffmpeg -i film.mkv -vcodec copie -acodec copie film.mp4) ?? le mkv original a des sous-titres mais pas la sortie au format mp4. Que se passe-t-il? qu'est-ce que je ne fais pas correctement?
oldboy le
9

Le conteneur MKV prend en charge les codecs vidéo et audio Pratiquement tout et prend également en charge les sous-titres et les menus DVD. Vous pouvez donc simplement copier les codecs de la vidéo d'entrée vers la vidéo de sortie avec le conteneur MKV avec sous-titres. Vous devez d'abord convertir SRT au format de sous-titres ASS

ffmpeg -i input.srt input.ass

et intégrez les sous-titres ASS à la vidéo

ffmpeg -i input.mp4 -i input.ass -c:v copy -c:a copy -c:s copy -map 0:0 -map 0:1 -map 1:0 -y out.mkv

Également travaillé avec le fichier VMW.

ffmpeg -i input.wmv -i input.ass -c:v copy -c:a copy -c:s copy -map 0:0 -map 0:1 -map 1:0 -y out.mkv

voir la page wiki Comparaison des formats de conteneurs

khan
la source
1
HV pas vraiment pertinent, il est toujours bienvenu de voir plus de solutions qu'une.
JasonXA
8

ffmpeg prend en charge le mov_text encodeur de sous titres qui est à peu près le seul pris en charge dans un conteneur MP4 et jouable par iTunes, Quicktime, iOS, etc.

Votre ligne se lirait:

ffmpeg -i input.mp4 -i input.srt -map 0:0 -map 0:1 -map 1:0 -c:s mov_text output.mp4

Mirko Klemm
la source
5

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 le SRT en tant que sous-titres logiciels avec ffmpeg avec 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 pu créer un fichier M4V.

D Coetzee
la source
3

Je vais fournir une réponse simple et générale qui fonctionne avec n'importe quel nombre d'audios et de sous - titres srt et respecte les métadonnées qui peuvent inclure le conteneur mkv . Ainsi, il ajoutera même les images que la matroska peut inclure en tant que pièces jointes (mais pas d'autres types AFAIK) et les convertira en pistes; vous ne pourrez pas regarder mais ils seront là (vous pouvez les démultiplexer). Ah, et si le mkv a des 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 du -map 0, qui dit à FFmpeg d'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 de joindre n'importe quel type de fichier), il se termine par une erreur.

Vous pouvez créer un lot simple mkv2mp4.bat, si vous le faites habituellement, pour créer un mp4 avec le même nom que le mkv . Ce serait mieux avec le contrôle des erreurs, un nom de sortie différent, etc., mais vous obtenez le point.

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

Maintenant, vous pouvez simplement courir

mkv2mp4 "Video with subtitles etc.mkv"

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

cdlvcdlv
la source
-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"

Remplacez uniquement les variables Linux

Daniel Gianni
la source
Voulez-vous élaborer?
RamenChef
-3

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

mkvmerge -o output.mkv video.mp4 subtitle.srt
Corley Kinnane
la source
3
Voulez-vous commenter pourquoi votre approche résoudrait le problème du PO?
mjuarez