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.
@++