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.
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:
Si vous les inversez, vous dites à FFmpeg:
Sinon, vous pouvez simplement utiliser -c:v copy -c:a copy -c:s mov_text
dans n'importe quel ordre.
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
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
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
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
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.
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.