Convertir un DVD en mp4

22 février 2015 - Mots-clés : Linux TVnum

Installation des packages

# apt install vobcopy
# apt install mjpegtools
# apt install ffmpeg

Explications

Le but est pour tous les DVD d'un coffet, d'obtenir un fichier par épisode au format mp4. Je souhaite garder les deux streams audio l'un en français, l'autre en anglais.

Je crée un répertoire quelque part dans mon home directory :

$ mkdir ~/coffret
$ cd ~/coffret

Je crée un répertoire pour chaque DVD (par exemple ici le DVD 2 de la saison 1) :

$ mkdir s1d2
$ cd s1d2

La première étape consiste à extraire l'intégralité de chaque DVD en un fichier unique MPEG. J'emploie pour cela le script vob2mpg.sh suivant :

#!/bin/bash
set -e -x
cd=${PWD##*/}
vobcopy -l -i /dev/cdrom
ffmpeg -i *.vob -map 0:v:0 -map 0:a:1 -map 0:a:0 -vcodec copy -acodec copy -target pal-dvd ${cd}.mpg
rm -f *.vob
echo "make cut files"
$ vob2mpg.sh

J'obtiens au final un gros fichier s1d2.mpg.

Il faut maintenant exécuter projectx pour délimiter les épisodes et sauvegarder le découpage avec l'extension .cut. Par exemple, les fichiers s1e4.cut, s1e5.cut et s1e6.cut pour les trois épisodes 4, 5 et 6 de la saison 1.

Ensuite, vient l'extraction des épisodes et leur conversion en mp4. Je fais cela avec le script split.sh suivant :

#!/bin/bash
set -e -x
cd=${PWD##*/}
for e in *.cut ; do
   basename=`basename $e .cut`
   projectx ${cd}.mpg -cut ${e} -name ${basename}.mpg -ini ~/.projectx/X.ini
   mplex -V -f 8 -o ${basename}.mpg ${basename}.ac3 ${basename}-02.ac3 ${basename}.m2v
   rm -f *.ac3 *.m2v *.log *.txt *.Xpl
   ffmpeg -i ${basename}.mpg -crf 25.0 -c:v libx264 -c:a ac3 -strict -2 -ar 48000 -b:a 160k -map 0:v:0 -map 0:a:0 -map 0:a:1 -coder 1 -threads 0 ${basename}.mp4
done
rm -f *.mpg *.cut
$ split.sh

J'obtiens au final les épisodes au format mp4 nommés comme les fichiers .cut : s1e4.mp4, s1e5.mp4 et s1e6.mp4.

Cela a bien fonctionné pour mon coffret, je ne sais pas si ça marche pour les vôtres, à vous d'adapter si nécessaire !

Cas particulier d'un DVD illisible

Parmi tous les DVD de mon coffret, il y en a un qui n'est pas lisible intégralement : le script vob2mpg.sh ne se termine pas correctement (le 1er DVD de la saison 1 par exemple).

Dans ce cas, il faut faire plus de travail à la main. D'abord je commence par monter le DVD dans /mnt/dvd :

$ mkdir /mnt/dvd
$ mount -t iso9660 /dev/cdrom /mnt/dvd -o ro

Ensuite, je copie les fichiers .vob du DVD qui veulent bien se laisser copier sans erreur :

$ mkdir ~/coffret/s1d1
$ cd ~/coffret/s1d1
$ cp /mnt/dvd/video_ts/vts_01_1.vob  .
$ cp /mnt/dvd/video_ts/vts_01_2.vob  .
$ cp /mnt/dvd/video_ts/vts_01_3.vob  .
$ cp /mnt/dvd/video_ts/vts_01_4.vob  .
$ cp /mnt/dvd/video_ts/vts_01_5.vob  .
$ cp /mnt/dvd/video_ts/vts_01_6.vob  .
$ cp /mnt/dvd/video_ts/vts_01_7.vob  .
$ cp /mnt/dvd/video_ts/vts_01_8.vob  .

Dans mon cas, c'est le 4ème .vob qui ne se copie pas. J'ai donc les fichiers vts_01_1.vob, vts_01_2.vob, vts_01_3.vob, vts_01_5.vob, vts_01_6.vob, vts_01_7.vob, vts_01_8.vob. Je concatène les groupes de fichiers valides :

$ ffmpeg -i "concat:vts_01_1.vob|vts_01_2.vob|vts_01_3.vob" -map 0:v:0 -map 0:a:1 -map 0:a:0 -target pal-dvd -c copy s1d1.mpg

On se retrouve donc dans la situation décrite en premier mais avec un fichier mpeg incomplet. On fait comme ci-dessus : délimiter les épisodes, et lancer spilt.sh. Pour finir on procède de même avec la deuxième moitié :

$ ffmpeg -i "concat:vts_01_5.vob|vts_01_6.vob|vts_01_7.vob|vts_01_8.vob" -map 0:v:0 -map 0:a:1 -map 0:a:0 -target pal-dvd -c copy s1d1.mpg

Au final, il me manque un épisode, mais c'est mieux que rien du tout !

Quand tout est fini, je démonte le DVD :

$ umount /mnt/dvd