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.

319voto

Steven Penny Points 18523
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_text est important. Vous dites à FFmpeg :

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

Si vous les inversez, vous indiquez à FFmpeg :

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

Sinon, vous pouvez simplement utiliser -c:v copy -c:a copy -c:s mov_text dans n'importe quel ordre.

18 votes

Cette méthode permet d'ajouter les sous-titres au fichier en tant que flux, ce qui nécessite le support d'un lecteur pour afficher les sous-titres (tel que VLC).

5 votes

Oui @sunk818 c'est ce que cela signifie. Cela ajoute le sous-titre comme une piste qui peut être activée ou désactivée tant que le lecteur le supporte. M. Hyde et Paul ffmpeg peuvent également ajouter les sous-titres au-dessus de la vidéo elle-même, et dans ce cas, vous pouvez contrôler des choses comme la police et le positionnement.

5 votes

Les fichiers .srt doivent être importés avec -c:s copy pas avec -c:s mov_text .

163voto

HdN8 Points 382

NOTE : Cette solution "grave les sous-titres" dans la vidéo, de sorte que chaque spectateur de la vidéo sera obligé de les voir.

Si votre ffmpeg a libass activé au moment de la compilation, vous pouvez directement faire :

ffmpeg -i mymovie.mp4 -vf subtitles=subtitles.srt mysubtitledmovie.mp4

C'est le cas par exemple pour Ubuntu 20.10, vous pouvez vérifier si ffmpeg --version a --enable-libass .

Sinon, vous pouvez le libass (assurez-vous que votre installation de ffmpeg a la bibliothèque dans la configuration. --enable-libass ).

Convertissez d'abord les sous-titres en .ass format :

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

60 votes

Ils seront ainsi "gravés dans" la vidéo, ce qui signifie que vous ne pourrez pas les désactiver dans le lecteur. C'est différent de l'ajout d'un flux de sous-titres qui peut être lu par le lecteur et affiché si le spectateur le souhaite.

4 votes

Merci beaucoup pour cette solution. Est-il possible de spécifier la taille des caractères ?

1 votes

Jetez un coup d'œ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 pourrez forcer le style pour définir la police : ffmpeg.org/ffmpeg-filtres.html#sous-titres-1

79voto

dotokija Points 765

Vous essayez de muxer les sous-titres comme un 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 voulez juste 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

4 votes

Est-il possible d'ajouter plus d'un sous-titre ? Ce softsub sera-t-il reconnu comme langue inconnue ?

1 votes

Oui, c'est vrai. Je viens de le tester pour MKV :

10 votes

Ajoutez d'abord une autre entrée : -i input2.srt. Ensuite, mappez-la 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 copy -c:a copy \ -c:s srt -c:s srt output.mkv

14voto

khan Points 3811

Le conteneur MKV supporte pratiquement tous les codecs vidéo et audio et prend également en charge les sous-titres et les menus de 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 le format SRT en format de sous-titres ASS

ffmpeg -i input.srt input.ass

et intégrer 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

A également fonctionné 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

1 votes

H.V. pas vraiment pertinent, il est toujours bienvenu de voir plus de solutions qu'une seule.

12voto

Mirko Klemm Points 829

Ffmpeg supporte le mov_text l'encodeur de sous-titres qui est à peu près le seul à être pris en charge dans un conteneur MP4 et à pouvoir être lu par iTunes, Quicktime, iOS, etc.

Votre ligne se lirait comme suit :

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

1 votes

Notez que cela va ré-encoder la vidéo et l'audio. Utilisez -c:v copy -c:a copy pour les copier.

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