Transformer/Extraire un DVD en mkv

Published: 09-04-2017

Updated: 10-04-2017

By: Maxime de Roucy

tags: dvd ffmpeg mkv video

Pour plus de simplicité je fais une copie iso du DVD sur mon disque dure. Cette étape n’est pas nécessaire, on peut trés bien travailler directement sur /dev/sr0.

Sélection de la piste

Un DVD contient plusieurs titres, nous devons choisir le bon (le film).

Pour lire le titre n°1 d’un DVD

max@laptop % mpv     dvd://1     --dvd-device DVD.iso
max@laptop % mpv     dvdread://1 --dvd-device DVD.iso

dvd (anciennement appelé dvdnav) et dvdread sont deux implémentations différentes. dvd peut passer automatiquement d’un titre à l’autre. Le support de dvd://menu a été supprimé des version récente de mpv.

Il est possible de connaitre le titre actuellement joué via dvd en observant la sortie standard. DVDNAV, switched to title: 23 indique que je suis en train de lire le titre 23.

Pour lister les titres d’un DVD on peut utiliser lsdvd :

max@laptop % lsdvd DVD.iso
libdvdread: Encrypted DVD support unavailable.
Disc Title: …
Title: 01, Length: 00:00:37.080 Chapters: 01, Cells: 01, Audio streams: 01, Subpictures: 00
Title: 02, Length: 00:24:34.760 Chapters: 06, Cells: 06, Audio streams: 05, Subpictures: 02
…
Longest track: 09
max@laptop % lsdvd -t 02 -x DVD.iso
libdvdread: Encrypted DVD support unavailable.
Disc Title: …
Title: 02, Length: 00:24:34.760 Chapters: 06, Cells: 06, Audio streams: 05, Subpictures: 02
        VTS: 02, TTN: 01, FPS: 25.00, Format: PAL, Aspect ratio: 16/9, Width: 720, Height: 576, DF: Letterbox
        Palette: 108080 2b8080 eb8080 51ef5a 7d8080 b48080 a910a5 6addca d29210 1c76b8 50505a 30b86d 5d4792 3dafa5 718947 eb8080
        Number of Angles: 1
        Audio: 1, Language: fr - Francais, Format: ac3, Frequency: 48000, Quantization: drc, Channels: 6,AP: 0, Content: Undefined, Stream id: 0x80
	…
        Audio: 5, Language: en - English, Format: ac3, Frequency: 48000, Quantization: drc, Channels: 2, AP: 0, Content: Undefined, Stream id: 0x84
        Chapter: 01, Length: 00:01:40.320, Start Cell: 01
	…
        Chapter: 06, Length: 00:00:00.480, Start Cell: 06
        Cell: 01, Length: 00:01:40.320
	…
        Cell: 06, Length: 00:00:00.480
        Subtitle: 01, Language: fr - Francais, Content: Undefined, Stream id: 0x20,
        Subtitle: 02, Language: xx - Unknown, Content: Undefined, Stream id: 0x21,

Attention : j’ai eu des surprise avec certains DVD, j’indiquais à mpv de lire un certain titre et il en prenait un autre. Dans ce cas j’y vais à taton, je testes les titres jusqu’à trouver le bon.

ISO → VOB

Une fois qu’on déterminé le bon titre (ici 02) on l’extrait sous forme de VOB.

max@laptop % mpv dvdread://02 --dvd-device DVD.iso --stream-dump=titre01.vob
Playing: dvdread://02
libdvdread: Encrypted DVD support unavailable.
[dvd] There are 20 titles on this DVD.
[dvd] There are 1 angles in this DVD title.
[dvd] audio stream: 0 format: ac3 (5.1) language: fr aid: 128.
[dvd] audio stream: 1 format: ac3 (5.1) language: ja aid: 129.
[dvd] audio stream: 2 format: ac3 (stereo) language: fr aid: 130.
[dvd] audio stream: 3 format: ac3 (stereo) language: ja aid: 131.
[dvd] audio stream: 4 format: ac3 (stereo) language: en aid: 132.
[dvd] number of audio channels on disk: 5.
[dvd] subtitle ( sid ): 0 language: fr
[dvd] subtitle ( sid ): 1 language: unknown
[dvd] number of subtitles on disk: 2
[dvd] CHAPTERS: 00:00:00.000,00:01:40.320,00:09:55.040,00:22:17.360,00:23:44.120,
…

Les méta données seront perdues c’est pourquoi je les affiches ici (il faut les conserver).

On peut aussi utiliser dvd mais je le déconseille car plusieurs titres peuvent s’enchainer.

max@laptop % mpv dvd://02 --dvd-device DVD.iso --stream-dump titre01.vob
…
libdvdnav: DVD disk reports itself with Region mask 0x00000000. Regions: 1 2 3 4 5 6 7 8
[dvdnav] DVDNAV, switched to title: 23
Dumping 1409284096/0...
[dvdnav] DVDNAV, switched to title: 1
Dumping 1465001984/0...
…

VOB → MKV

ffmpeg

Avantage : permet d’extraire les sous-titre en même temps que la vidéo.
Désavange : ne permet pas de set les couleurs de sous-titre.

max@laptop % ffprobe titre01.vob
ffprobe version 3.2.4 Copyright (c) 2007-2017 the FFmpeg developers
…
Input #0, mpeg, from 'titre01.vob':
  Duration: 00:24:34.76, start: 0.280000, bitrate: 6990 kb/s
    Stream #0:0[0x1e0]: Video: mpeg2video (Main), yuv420p(tv, top first), 720x576 [SAR 16:15 DAR 4:3], 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x80]: Audio: ac3, 48000 Hz, 5.1(side), fltp, 384 kb/s
    Stream #0:2[0x81]: Audio: ac3, 48000 Hz, 5.1(side), fltp, 384 kb/s
    Stream #0:3[0x82]: Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s
    Stream #0:4[0x83]: Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s
    Stream #0:5[0x84]: Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s

max@laptop % ffmpeg -fflags +genpts -probesize 1G -analyzeduration 1G -i titre01.vob -map 0:0 -aspect:0:0 16:9 -map 0:1 -metadata:s:a:0 language=fre -map 0:6 -metadata:s:s:0 language=fre -codec copy titre01.mkv
ffmpeg version 3.2.4 Copyright (c) 2000-2017 the FFmpeg developers
…
Output #0, matroska, to 'titre01.mkv':
  Metadata:
    encoder         : Lavf57.56.101
    Stream #0:0: Video: mpeg2video (Main) (mpg2 / 0x3267706D), yuv420p(tv, top first), 720x576 [SAR 64:45 DAR 16:9], q=2-31, 25 fps, 25 tbr, 1k tbn, 90k tbc
    Stream #0:1(fre): Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, 5.1(side), 384 kb/s
    Stream #0:2(fre): Subtitle: dvd_subtitle
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
  Stream #0:6 -> #0:2 (copy)
Press [q] to stop, [?] for help
…
max@laptop % ffprobe titre01.mkv
…
Input #0, matroska,webm, from 'titre01.mkv':
  Metadata:
    ENCODER         : Lavf57.56.101
  Duration: 00:24:34.76, start: 0.000000, bitrate: 5929 kb/s
    Stream #0:0: Video: mpeg2video (Main), yuv420p(tv, top first), 720x576 [SAR 16:15 DAR 4:3], SAR 64:45 DAR 16:9, 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
    Metadata:
      DURATION        : 00:24:34.760000000
    Stream #0:1(fre): Audio: ac3, 48000 Hz, 5.1(side), fltp, 384 kb/s (default)
    Metadata:
      DURATION        : 00:24:34.304000000
    Stream #0:2(fre): Subtitle: dvd_subtitle (default)
    Metadata:
      DURATION        : 00:24:29.560000000

Options :

Il semble possible de gérer les chapitre avec ffmpeg via ffmetadata mais je n’ai jamais essayé. Je n’ai pas trouvé d’outil qui me permet de facilement extraire/converir les chapitre d’un dvd au format ffmetadata.

Sources :

mkvmerge

Avantage: outils matroska, on est sur que le mkv sera correcte,
Désavange: ne permet apparemment pas d’extraire les sous-titre en même temps que la vidéo.

mkvmerge -o output --option(s) <fichier sur lequel s'appliques les options> --option(s) <fich…> …
--disable-track-statistics-tags : désactive l'ajout de tag que je ne trouve pas necessaire (peut être mis n'importe ou dans la ligne de commande)

Extraction des chapitres de la piste :

max@laptop % dvdxchap -t 2 DVD.iso | tee titre01.chap
libdvdread: Encrypted DVD support unavailable.
CHAPTER01=00:00:00.000
CHAPTER01NAME=Chapter 01
CHAPTER02=00:01:40.320
CHAPTER02NAME=Chapter 02
CHAPTER03=00:09:55.040
CHAPTER03NAME=Chapter 03
CHAPTER04=00:22:17.360
CHAPTER04NAME=Chapter 04
CHAPTER05=00:23:44.120
CHAPTER05NAME=Chapter 05
CHAPTER06=00:24:34.280
CHAPTER06NAME=Chapter 06

Extraction de la vidéo, de l’audio :

max@laptop % mkvmerge -i titre01.vob
Fichier « titre01.vob » : conteneur : Flux de programme MPEG
Identifiant de piste 0 : video (MPEG-1/2)
Identifiant de piste 1 : audio (AC-3/E-AC-3)
Identifiant de piste 2 : audio (AC-3/E-AC-3)
Identifiant de piste 3 : audio (AC-3/E-AC-3)
Identifiant de piste 4 : audio (AC-3/E-AC-3)
Identifiant de piste 5 : audio (AC-3/E-AC-3)

max@laptop % mkvmerge --disable-track-statistics-tags -o titre01.mkv --aspect-ratio 0:16/9 --audio-tracks 1 --language 1:fre titre01.vob --chapter-language eng --chapters titre01.chap
mkvmerge v10.0.0 ('To Drown In You') 64bit
« titre01.vob » : Utilisation du démultiplexeur pour le format « Flux de programme MPEG ».
« titre01.vob » piste 0 : Utilisation du module de sortie pour le format « MPEG-1/2 ».
« titre01.vob » piste 1 : Utilisation du module de sortie pour le format « AC-3 ».
Le fichier « titre01.mkv » est ouvert en écriture.
…
max@laptop % ffprobe titre01.mkv
ffprobe version 3.2.4 Copyright (c) 2007-2017 the FFmpeg developers
…
Input #0, matroska,webm, from 'titre01.mkv':
  Metadata:
    encoder         : libebml v1.3.4 + libmatroska v1.4.7
    creation_time   : 2017-04-09T16:15:46.000000Z
  Duration: 00:24:34.76, start: 0.000000, bitrate: 4139 kb/s
    Chapter #0:0: start 0.000000, end 100.320000
    Metadata:
      title           : Chapter 01
    Chapter #0:1: start 100.320000, end 595.040000
    Metadata:
      title           : Chapter 02
    Chapter #0:2: start 595.040000, end 1337.360000
    Metadata:
      title           : Chapter 03
    Chapter #0:3: start 1337.360000, end 1424.120000
    Metadata:
      title           : Chapter 04
    Chapter #0:4: start 1424.120000, end 1474.280000
    Metadata:
      title           : Chapter 05
    Chapter #0:5: start 1474.280000, end 1474.760000
    Metadata:
      title           : Chapter 06
    Stream #0:0: Video: mpeg2video (Main), yuv420p(tv, top first), 720x576 [SAR 16:15 DAR 4:3], SAR 64:45 DAR 16:9, 50 fps, 50 tbr, 1k tbn, 50 tbc (default)
    Stream #0:1(fre): Audio: ac3, 48000 Hz, 5.1(side), fltp, 384 kb/s (default)

Pour récupérer les sous-titre vous pouvez suivre Extraction de sous-titre d’un DVD.

Intégration des sous-titre dans titre01.mkv :

max@laptop % mv {titre01,tmp}.mkv
max@laptop % mkvmerge --disable-track-statistics-tags -o titre01.mkv tmp.mkv --language 0:fre titre01_subtitle_fr.idx
mkvmerge v10.0.0 ('To Drown In You') 64bit
« tmp.mkv » : Utilisation du démultiplexeur pour le format « Matroska ».
« titre01_subtitle_fr.idx » : Utilisation du démultiplexeur pour le format « VobSub ».
« tmp.mkv » piste 0 : Utilisation du module de sortie pour le format « MPEG-1/2 ».
« tmp.mkv » piste 1 : Utilisation du module de sortie pour le format « AC-3 ».
« titre01_subtitle_fr.idx » piste 0 : Utilisation du module de sortie pour le format « VobSub ».
…
max@laptop % ffprobe titre01.mkv
ffprobe version 3.2.4 Copyright (c) 2007-2017 the FFmpeg developers
…
Input #0, matroska,webm, from 'titre01.mkv':
  Metadata:
    encoder         : libebml v1.3.4 + libmatroska v1.4.7
    creation_time   : 2017-04-09T16:16:17.000000Z
  Duration: 00:24:34.76, start: 0.000000, bitrate: 4142 kb/s
    Chapter #0:0: start 0.000000, end 100.320000
    Metadata:
      title           : Chapter 01
    Chapter #0:1: start 100.320000, end 595.040000
    Metadata:
      title           : Chapter 02
    Chapter #0:2: start 595.040000, end 1337.360000
    Metadata:
      title           : Chapter 03
    Chapter #0:3: start 1337.360000, end 1424.120000
    Metadata:
      title           : Chapter 04
    Chapter #0:4: start 1424.120000, end 1474.280000
    Metadata:
      title           : Chapter 05
    Chapter #0:5: start 1474.280000, end 1474.760000
    Metadata:
      title           : Chapter 06
    Stream #0:0: Video: mpeg2video (Main), yuv420p(tv, top first), 720x576 [SAR 16:15 DAR 4:3], SAR 64:45 DAR 16:9, 50 fps, 50 tbr, 1k tbn, 50 tbc (default)
    Stream #0:1(fre): Audio: ac3, 48000 Hz, 5.1(side), fltp, 384 kb/s (default)
    Stream #0:2(fre): Subtitle: dvd_subtitle, 720x576 (default)

Extraction d’un mkv

Pour extraire un élément d’un mkv, ici un sous-titre au format vobsub :

max@laptop % mkvmerge -i titre01.mkv
Fichier « titre01.mkv » : conteneur : Matroska
Identifiant de piste 0 : video (MPEG-1/2)
Identifiant de piste 1 : audio (AC-3/E-AC-3)
Identifiant de piste 2 : subtitles (VobSub)
Chapitres : 6 entrées

max@laptop % mkvextract tracks titre01.mkv 2:titre01_subtitle.idx
Extraction de la piste 2 avec le codec « S_VOBSUB » dans le fichier « titre01_subtitle.sub ». Format de conteneur : VobSubs
Écriture du fichier d'index VobSub « titre01_subtitle.idx ».
Progression : 100%

max@laptop % l
total 730M
-rw-r--r-- 1 max users 729M  9 avril 18:16 titre01.mkv
-rw-r--r-- 1 max users  15K  9 avril 18:27 titre01_subtitle.idx
-rw-r--r-- 1 max users 1,3M  9 avril 18:27 titre01_subtitle.sub