Comment associer des sous-titres à une vidéo
On a vu dans des articles précédents comment générer des sous-titres au format SRT et les recaler. Si les fichiers SRT sont placés dans le même dossier que la vidéo et nommés comme elle (avec la convention consistant à faire précéder l'extension de fichier du code langue quand il y a plusieurs langues), VLC les identifiera automatiquement et, s'il y a plusieurs langues, les listera dans le menu Sous-titres, classés dans l'ordre qui lui convient.
L'avantage : on peut les modifier à tout moment. L'inconvénient : 2 fichiers à se trimballer, voire plus si vous avez plusieurs langues (3 langues dans l'exemple ci-dessous).
Avec un fichier mp4 en utilisant le codec mov_text
Heureusement il est possible de combiner ces sous-titres à la vidéo. C'est possible avec l'incontournable ffmpeg. Attention, cela ne sera pas compatible avec tous les players. VLC sait gérer, mais il ne les affichera pas par défaut : il faudra les activer dans Sous-titres > Piste de Sous-titres.
On va commencer par ouvrir une ligne de commandes. Par exemple dans l'explorateur de fichiers, afficher le dossier dans lequel se trouvent la vidéo et les sous-titres et taper cmd dans la barre de navigation. Ou dans le menu Démarrer, taper cmd et naviguer jusqu'au répertoire. On supposera que vous aurez au préalable ajouté ffmpeg à vos variables d'environnement Windows (sinon il faudra copier vos fichiers à traiter dans le même dossier que ffmpeg).
La syntaxe est particulièrement ardue, il va falloir s'accrocher. Le principe est de mapper les différents flux : la vidéo, le sous-titre 1 (en mentionnant sa langue) etc
- -i : précède le nom de fichier qu'on passe en entrée (i pour input)
- -c copy : copie à l'identique la totalité des flux, c'est à dire qu'il n'y a pas de réencodage, donc c'est rapide, ça ne dégrade pas la qualité et ça ne bouffe pas de ressources donc c'est utilisable même sur un vieux PC
- -map permet de sélectionner et- contrôler manuellement dans quel ordre chaque composant (stream) de la vidéo sera ajouté (on met la vidéo en 1e position c'est à dire 0, la 1e piste de sous-titre en 1 etc)
- mov_text : un codec permettant de convertir des sous-titres au format texte (le ou les SRT) en métadonnées intégrées à la vidéo
- -metadata : permet de renseigner la langue de chaque piste de sous-titres (qui est une métadonnée) via language. Pas obligatoire, mais ce sera plus confortable pour l'utilisateur de la vidéo. Le premier srt passé via -i se trouvera sur la piste de sous-titre 0 et aura tel code de langue, le 2e srt passé sur se trouvera sur la piste de sous-titre1…)
le premier :s veut dire stream
Voici quelques exemples à partir d'une vidéo nommée in.mp4, qui au final vous donnent un fichier output.mp4
Combiner avec une piste de sous titres (une langue, ici l'anglais)
ffmpeg -i "in.mp4" -i "in.srt" -map 0 -map 1 -c copy -c:s mov_text -metadata:s:s:0 language=eng output.mp4
Combiner avec des sous-titres en 2 langues (français et allemand) donc 3 flux
ffmpeg -i "in.mp4" -i "in.fr.srt" -i "in.de.srt" -map 0 -map 1 -map 2 -c copy -c:s mov_text -metadata:s:s:0 language=fre -metadata:s:s:1 language=deu output.mp4
Combiner avec des sous-titres en 3 langues (français, anglais et suédois)
ffmpeg -i "in.mp4" -i "in.fr.srt" -i "in.en.srt" -i "in.sv.srt" -map 0 -map 1 -map 2 -map 3 -c copy -c:s mov_text -metadata:s:s:0 language=fre -metadata:s:s:1 language=eng -metadata:s:s:2 language=swe output.mp4
L'exemple ci-dessous associe 3 pistes de sous-titres à une vidéo nommée Reportage Dance Machine 5.mp4
Si vous voulez une meilleure compatibilité avec les lecteurs de vidéo…
Deux solutions :
- incruster les sous-titres à l'image pour une compatibilité maximale (mais vous ne pourrez plus changer leur aspect, comme exemple les grossir. Si vous agrandissez la vidéo, les contours des lettres seront moins nettes. Et vous ne pouvez combiner qu'une piste de sous-titres)
ffmpeg -i "in.mp4" -vf subtitles="in.fr.srt" output.mp4
- choisir le format d'export mkv (Là on aura des textes redimensionnables, possibilité de plusieurs pistes, etc tout comme la méthode utilisant le codec mov_text)
ffmpeg -i "in.mp4" -i "in.fr.srt" -i "in.de.srt" -map 0:v -map 0:a -map 1 -map 2 -c:v copy -c:a copy -c:s srt -metadata:s:s:0 language=fre -metadata:s:s:1 language=ger output.mkv
Enfin, petit bonus : voici une liste des codes de langue