web-dev-qa-db-fra.com

Utilisez ffmpeg pour ajouter des sous-titres de texte

J'essaie d'ajouter des sous-titres de texte à un conteneur .mp4 à l'aide de ffmpeg:

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

Lorsque j'essaie de lancer cette ligne, cela me donne 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 mp4 supporte 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:

Codeur (identifiant de codec 94210) non trouvé 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 des sous-programmes mp4 et mkv, et de la nécessité de l’activer ou de le compiler séparément.

95
0-alpha
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-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

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

142
Steven Penny

Utilisez la bibliothèque 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

Puis ajoutez-les en utilisant un filtre vidéo:

ffmpeg -i mymovie.mp4 -vf ass=subtitles.ass mysubtitledmovie.mp4
52
HdN8

Vous essayez de multiplexer les sous-titres en tant que flux de sous-titres. C'est simple mais une syntaxe différente est utilisée pour MP4 (ou M4V) et MKV. Dans les deux cas, vous devez spécifier un codec audio et vidéo 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
48
dotokija

Le conteneur MKV prend en charge les codecs audio et vidéo Pratiquement tout, et prend également en charge les sous-titres et les menus DVD. Ainsi, vous pouvez simplement copier des codecs d'une vidéo d'entrée vers une vidéo de sortie avec un conteneur MKV avec sous-titres. D'abord, vous devriez convertir SRT en format de sous-titre 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

É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 conteneur

8
khan

ffmpeg supporte le mov_text encodeur de sous-titres, qui est à peu près le seul supporté dans un conteneur MP4 et lisible 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

6
Mirko Klemm

J'ai essayé d'utiliser MP4Box pour cette tâche, mais il ne pouvait pas gérer le M4V que je traitais. J'ai réussi à intégrer le SRT en tant que sous-titres souples 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 de fichier M4V.

4
D Coetzee

Je vais fournir une réponse simple et générale qui fonctionne avec n'importe quel nombre d'audios et srt sous-titres et respecte les métadonnées pouvant inclure le conteneur mkv . Donc, il va même ajouter les images que la matroska peut inclure en tant que pièces jointes (mais pas un autre type, autant que je sache) et les convertir en pistes; vous ne pourrez pas regarder mais ils seront là (vous pouvez les démultiplier). Ah, et si le mkv a aussi des chapitres le mp4 .

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

Comme vous pouvez le constater, il s’agit de la -map 0, cela indique FFmpeg d’ajouter toutes les pistes, y compris les métadonnées, les chapitres, les pièces jointes, etc. S'il existe une "piste" non reconnue ( mkv permet de joindre tout type de fichier ), il se terminera par un Erreur.

Vous pouvez créer un simple lot mkv2mp4.bat, si vous faites habituellement cela, pour créer un mp4 avec le même nom que le mkv . Ce serait mieux avec le contrôle d'erreur, 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 cela créera "Vidéo avec sous-titres, etc.mp4" avec le maximum d'informations incluses.

2
cdlvcdlv