Intégrer des sous-titres à un .MKV

Allez,

Je partage ici avec vous un bout de script que j’ai écrit après que mon PC média center est rendu l’âme (RiP) ; il y a quelques mois (Depuis remplacé par un Raspberry Pie 2 + OpenElec). J’utilisais VLC pour lire mes fichiers vidéos (de vacances), avec un fichier de sous-titre du même nom à côté du fichier vidéo (et oui, je passe mes vacances en anglais et j’ai besoin des sous-titres ensuite : ça vous pose un problème ?). Ma solution de rechange temporaire ne permettait pas de lire le fichier sous-titre à côté du fichier vidéo, mais supportait très bien les sous-titres intégrés dans la vidéo. J’ai donc cherché à intégrer mes sous-titres dans le « .mkv » de la vidéo.

Pour cela, il existe un programme assez connu sous Linux : mkvmerge, packagé dans : MKVtoolnix (Pour Windows et Linux). Qui va nous permettre d’intégrer des sous-titres dans le conteneur mkv. Une fois installé on trouve dans le dossier d’installation notre exécutable « mkvmerge.exe » utilisable en ligne de commande PowerShell par exemple.

Assez tourné autour du pot, je vous donne la commande pour intégrer un sous-titre en « .ass » dans un fichier vidéo mkv, en PowerShell :

Invoke-Expression -Command ("& '$mkvmergepath"+"\mkvmerge.exe' -o "+"'$outfile' "+"'$infile' "+'--language "0:fre" --track-name "0:Francais" '+"'$insub'")

Ou $outfile est un nouveau fichier mkv avec le sous-titre dans la vidéo, $infile le fichier vidéo en entrée, et $insub les sous-titres à intégrer dans la vidéo. Vous  noterez qu’on indique au passage la langue du Sous-Titre en code ISO 639, ainsi que le numéro et le titre de la piste de sous-titre.

Après on peut raffiner pour faire du traitement de masse : Je vous donne un script « type » (ne fonctionne pas tel-quel) pour ça :

$Indir = 'C:\Mes\Films\De\Vacances'
#liste les vidéos contenu dans $Indir
$listFichiers = Get-ChildItem $Indir.PSPath
$listvideos = $listFichiers | Where-object {$_.name -match '.*\.mkv'} | Sort-Object
$listSubTitles = $listFichiers | Where-object {$_.name -match '.*\.ass'} | Sort-Object
#Prédicat : les fichiers sont triés dans l'ordre alphabétique.
for ($i=0; $i -lt $listvideos.count; $i++){
    $infile = $listvideos[$i].FullName
    $insub = $listSubTitles[$i].FullName
    $outfile = $infile.FullName -replace '\.mkv','#merged.mkv'
    #On intègre le sous-titre dans un nouveau mkv avec mkv merge
    Invoke-Expression -Command ("& '$mkvmergepath"+"\mkvmerge.exe' -o "+"'$outfile' "+"'$infile' "+'--language "0:fre" --track-name "0:Francais" '+"'$insub'")
    #Puis on supprime les anciens fichiers pour laisser unquiement le mergé (TODO : vérifier qu'on a pas eu d'erreur)
    Remove-Item -Path $infile -Force 
    Remove-Item -Path $insub -Force
    #puis l'on renomme le fichier.
    Move-Item -Path $outfile -Destination ($infile -replace '#merged.mkv',"\.mkv") -Force
 }

Et voilà, je ne sais pas vous mais ça m’a bien facilité la gestion de mes films de vacances.

@++

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. Apprenez comment les données de vos commentaires sont utilisées.