grim7reaper

Un artisan du code

Extraire les sous-titres d’un DVD mal foutu

Cet article provient de mon ancien site Internet.

Background

Je possède quelques DVD et j’ai pris l’habitude de les extraire et de les encoder sur mon ordinateur afin d’éviter d’avoir à les trimballer à chaque déplacement. Pour cela, j’utilise le couple mplayer/mencoder et ça fonctionne très bien. En général…

Et là, c’est le drame !

Tout allait bien dans le meilleur des mondes jusqu’à ce que je tombe sur ça.

subtitle ( sid ): 0 language: unknown
subtitle ( sid ): 0 language: fr
subtitle ( sid ): 0 language: nl
number of subtitles on disk: 3

Et là, on se dit que ça risque de poser un petit soucis à mencoder vu qu’il se base sur le sid pour identifier la piste à extraire :-/

Et effectivement, je n’ai pas réussi à extraire les sous-titre français. Cela dit, c’était peut-être réalisable, mais comme je ne maîtrise pas le couple mplayer/mencoder à 100% bah je n’ai pas trouvé de solutions (j’ai bien tenté quelques bidouilles à base de slang et de IFO, mais en vain…)

La seule technique que j’ai trouvé pour avoir les sous-titres français, c’est de les changer via la touche j en mode interactif (c’est déjà pas mal, mais totalement inutilisable dans un script d’extraction).

Ma solution

Du coup, je me suis tourné vers un autre poids lourd du domaine : transcode.

Voici donc la procédure à suivre :

Les commandes magiques
1
2
3
mplayer -dvd-device POINT_DE_MONTAGE dvd://TITRE -identify
tccat -i POINT_DE_MONTAGE -T TITRE,-1 | tcextract -x ps1 -t vob -a 0xN > subs
subtitle2vobsub -o subtitles -i CHEMIN_JUSQU_AU_FICHIER_IFO_CORRESPONDANT < subs

Identification

La première commande m’a permis de repérer un truc fort utile pour la suite. Au début, rien de bien nouveau.

subtitle ( sid ): 0 language: unknown

ID_SUBTITLE_ID=0
subtitle ( sid ): 0 language: fr

ID_SUBTITLE_ID=0
ID_SID_0_LANG=fr
subtitle ( sid ): 0 language: nl

ID_SUBTITLE_ID=0
ID_SID_0_LANG=nl
number of subtitles on disk: 3

Mais peu de temps après le début de la lecture du chapitre j’ai vu apparaître ça.

ID_SUBTITLE_ID=0
ID_SUBTITLE_ID=1
ID_SUBTITLE_ID=2
ID_SUBTITLE_ID=3
ID_SUBTITLE_ID=4
ID_SUBTITLE_ID=5

Hum, il y aurait donc six pistes de sous-titres. Bien, alors examinons cela ! Pour ce faire, j’ai lancé le DVD (sans le casser bien sûr, haha -___-"…) et j’ai testé les différentes pistes avec la fameuse touche j. Au final, j’ai :

La seule chose qui différencie la piste 2 et 3, c’est la taille de la police utilisée (idem pour 0 et 1 et pour 4 et 5). Bien ! Maintenant que l’identification est faite, passons à l’extraction.

Extraction

Il faut commencer par monter le DVD (via mount, pmount ou votre explorateur de fichier). Maintenant, voyons de plus près comment fonctionne cette commande (enfin, ces deux commandes serait plus juste).

La première commande est relative explicite. Le seul point un peu mystérieux c’est le -1 : il sert à extraire tous les chapitres d’un titre.

La seconde commande mérite un peu plus d’explications. Le ps1 est le « codec » utilisé pour extraire les sous-titres (comment je le sais ? En bien parce que je RFTM !). Le vob c’est tout bêtement le type de fichier sur lequel je bosse (DVD donc). Et enfin, la fameuse constante magique 0xN ou N est égal à 20 + l’ID de la piste à extraire (0x22 ou 0x23 dans mon cas).

Bon, maintenant que l’on a nos sous-titres, il ne reste plus qu’à les convertir. Je ne sais même pas si le format dans lequel je les ai récupérés est exploitable, mais de toutes façons j’ai l’habitude de bosser avec des .idx et des .sub (qui font un joli vobsub une fois mis ensemble).

Conversion

Bon bah là, je pense que c’est trivial donc je ne vais pas m’attarder dessus. On choisit le nom des fichiers de sortie (subtitles.idx et subtitles.sub dans mon cas) et on indique bien le fichier IFO correspondant au VOB sur lequel on bosse depuis le début.