Bonjour,
Ma problématique est simple : j’ai des DVD, mais ça me fait suer d’allumer mon lecteur DVD et/ou de changer le DVD alors que ma bobox a un disque dur de capacité non négligeable pour stocker de la vidéo (paraît que c’est une qualité d’informaticien d’être paresseux ).
Question : comment je transforme ces DVD en fichiers vidéos lisibles sur ma bobox ?
Réponse : grâce à vobcopy et avconv
[size=150]Extraction du DVD[/size]
Si le DVD est encrypté, il est nécessaire d’avoir la librairie libdvdcss non disponible dans les dépôts Debian, mais que l’on peut récupérer sur les dépôts deb-multimédia (choisir son architecture puis chercher libdvdcss dans la page).
Personnellement, sur ma Debian Sid, j’ai simplement téléchargé le fichier adéquat et je l’ai installé par une dpkg -i, chacun voit midi à sa porte
On met le DVD dans son lecteur, et on le monte (un clique dessus dans Dolphin par exemple), sinon vobcopy ne le trouvera pas.
On vérifie ce qu’il contient :
[code]$ vobcopy --info
Vobcopy 1.2.0 - GPL Copyright © 2001 - 2009 robos@muon.de
[Hint] All lines starting with “libdvdread:” are not from vobcopy but from the libdvdread-library
[Info] Path to dvd: /dev/sr0
libdvdread: Using libdvdcss version 1.2.13 for DVD access
[Info] Name of the dvd: MON_DVD_A_MOI
[Info] There are 11 titles on this DVD.
[Info] There are 66 chapters on the dvd.
[Info] Most chapters has title 1 with 22 chapters.
[Info] All titles:
[Info] Title 1 has 22 chapters.
[…][/code]
Ensuite extrait le contenu du DVD qui nous intéresse. Là deux possibilités :
[ul][li]pas d’option : par défaut vobcopy récupère le titre avec le plus de chapitres, ce qui en général correspond à ce que l’on recherche[/li]
[li]–longest : extrait le titre avec le temps de lecture le plus long[/li][/ul]
Apparemment ça dépend des titres, pour le moment je m’en suis toujours tiré sans option.
Remarque : sans option, vobcopy extrait des fichiers de 2 Go pour rester compatible avec les systèmes de fichiers ne supportant les fichiers de grande taille ; normalement les Debian depuis Woody (il me semble) et les systèmes de fichiers ext >= 2 supportent les fichiers de taille supérieure à 2 Go, donc autant récupérer un fichier unique avec l’option –large-file
[code]$ vobcopy --large-file
Vobcopy 1.2.0 - GPL Copyright © 2001 - 2009 robos@muon.de
[Hint] All lines starting with “libdvdread:” are not from vobcopy but from the libdvdread-library
[Info] Path to dvd: /dev/sr0
libdvdread: Using libdvdcss version 1.2.13 for DVD access
[Info] Name of the dvd: MON_DVD_A_MOI
[Info] There are 11 titles on this DVD.
[Info] There are 66 chapters on the dvd.
[Info] Most chapters has title 1 with 22 chapters.
[Info] There are 11 angles on this dvd.
[Info] Using Title: 1
[Info] Title has 22 chapters and 1 angles
[Info] Using Chapter: 1
[Info] Using Angle: 1
libdvdread: Attempting to retrieve all CSS keys
libdvdread: This can take a long time, please be patient
libdvdread: Get key for /VIDEO_TS/VIDEO_TS.VOB at 0x0000013c
libdvdread: Elapsed time 1
[…]
[Info] DVD-name: MON_DVD_A_MOI
[Info] Outputting to /home/sebastien/Videos/dvd/MON_DVD_A_MOI.vob
[========================================================================================|] 100.0% 00:00 [Info] Successfully copied file /home/sebastien/Videos/dvd/MON_DVD_A_MOI.vob
[Info] Copying finished! Let’s see if the sizes match (roughly)
[Info] Combined size of title-vobs: 2896893952 (2763 MB)
[Info] Copied size (size on disk): 2896893952 (2763 MB)
[Info] Everything seems to be fine, the sizes match pretty good
[Hint] Have a lot of fun![/code]
[size=150]Découpage et ré-encodage[/size]
Ce fichier contient plusieurs épisodes, et je préfère faire un fichier par épisode, je vais donc le découper. Ma méthode est manuelle, il faut aller chercher les temps de séparation des épisodes en regardant le .vob (totem ou vlc fonctionnent très bien), mais bon, c’est à faire une seule fois.
D’abord on vérifie ce que contient notre fichier .vob extrait précédemment :
$ avconv -i MON_DVD_A_MOI.vob
avconv version 0.8.6-6:0.8.6-1, Copyright (c) 2000-2013 the Libav developers
built on Mar 24 2013 18:40:26 with gcc 4.7.2
[mpeg @ 0x1c35300] max_analyze_duration reached
Input #0, mpeg, from 'MON_DVD_A_MOI.vob':
Duration: 01:00:16.36, start: 0.360000, bitrate: 6408 kb/s
Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x576 [PAR 64:45 DAR 16:9], 7000 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0.1[0x80]: Audio: ac3, 48000 Hz, stereo, s16, 192 kb/s
At least one output file must be specified
Il est simple, un flux vidéo et un flux audio (il faudra que je complète avec un exemple plus complexe).
Je vais donc convertir le flux vidéo en xvid (avconv supporte pas mal de formats, à vous de faire votre choix) et le flux audio en mp3 (encore par flemmardise, l’AC3 est de meilleure qualité, mais ça m’oblige à prendre une seconde télécommande pour le son ) :
$ avconv -i MON_DVD_A_MOI.vob -t 00:10:02 -f avi -c:v libxvid -b:v 3000k -c:a libmp3lame -b:a 128k MON_DVD_A_MOI-1.avi
Explication des options choisies :
[ul][li]-i MON_DVD_A_MOI.vob : le nom du fichier d’entrée[/li]
[li]-t 00:10:02 : extraction de 10 minutes et 2 secondes, on peut aussi mettre 602 (le temps équivalent en secondes)[/li]
[li]-f avi : on précise le format du fichier de sortie (option avant le fichier de sortie, mais après le fichier d’entrée) ; apparemment non nécessaire, la plupart du temps l’extension du fichier de sortie permet ) avconv de le deviner[/li]
[li]-c:v libxvid : précision du codec © pour la vidéo (v), soit xvid (cf. avconv -codecs pour les codecs supportés)[/li]
[li]-b:v 3000k : précision du bitrate (b) pour la vidéo (v) ; je suis parti sur une valeur moyenne, convenant bien à ma télé cathodique, à adapter donc[/li]
[li]-c:a libmp3lame : précision du codec © pour l’audio (a), soit mp3 encodé par lame, qu’il faut donc avoir d’installé par ailleurs[/li]
[li]-b:a 128k : précision du bitrate (b) pour l’audio (a), à adapter[/li]
[li]MON_DVD_A_MOI-1.avi : nom du fichier de sortie[/li][/ul]
Ce qui donne :
$ avconv -i MON_DVD_A_MOI.vob -t 00:10:02 -f avi -c:v libxvid -b:v 3000k -c:a libmp3lame -b:a 128k MON_DVD_A_MOI-1.avi
avconv version 0.8.6-6:0.8.6-1, Copyright (c) 2000-2013 the Libav developers
built on Mar 24 2013 18:40:26 with gcc 4.7.2
[mpeg @ 0xe77300] max_analyze_duration reached
Input #0, mpeg, from 'MON_DVD_A_MOI.vob':
Duration: 01:00:16.36, start: 0.360000, bitrate: 6408 kb/s
Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x576 [PAR 64:45 DAR 16:9], 7000 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0.1[0x80]: Audio: ac3, 48000 Hz, stereo, s16, 192 kb/s
[buffer @ 0xe77f20] w:720 h:576 pixfmt:yuv420p
Output #0, avi, to 'MON_DVD_A_MOI-1.avi':
Metadata:
ISFT : Lavf53.21.1
Stream #0.0: Video: mpeg4, yuv420p, 720x576 [PAR 64:45 DAR 16:9], q=2-31, 3000 kb/s, 25 tbn, 25 tbc
Stream #0.1: Audio: libmp3lame, 48000 Hz, stereo, s16, 128 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (mpeg2video -> libxvid)
Stream #0:1 -> #0:1 (ac3 -> libmp3lame)
Press ctrl-c to stop encoding
[mpeg2video @ 0xe79400] warning: first frame is no keyframe
Last message repeated 1 times
warning: first frame is no keyframe9148kB time=598.90 bitrate=3134.4kbits/s
[mpeg2video @ 0xe79400] warning: first frame is no keyframe
[ac3 @ 0xe7bac0] frame sync error
Error while decoding stream #0:1
[ac3 @ 0xe7bac0] frame CRC mismatch
[ac3 @ 0xe7bac0] frame sync error
Error while decoding stream #0:1
[ac3 @ 0xe7bac0] frame sync error
Error while decoding stream #0:1
[ac3 @ 0xe7bac0] frame CRC mismatch
[mpeg2video @ 0xe79400] warning: first frame is no keyframe
Last message repeated 1 times
[ac3 @ 0xe7bac0] frame sync error
Error while decoding stream #0:1
[ac3 @ 0xe7bac0] frame sync error
Error while decoding stream #0:1
[ac3 @ 0xe7bac0] frame CRC mismatch
[ac3 @ 0xe7bac0] frame sync error
Error while decoding stream #0:1
frame=15048 fps=135 q=2.0 Lsize= 230311kB time=601.90 bitrate=3134.6kbits/s
video:219949kB audio:9405kB global headers:0kB muxing overhead 0.417531%
Je n’ai pas poussé pour savoir si les erreurs rencontrées sur le flux ac3 sont gênantes ou pas.
Pour le second épisode, il faut préciser une durée et un début d’extraction, en ajoutant l’option -ss (idem que -t, vous pouvez préciser un temps en secondes) :
avconv -i MON_DVD_A_MOI.vob -ss 00:09:59 -t 00:10:03 -f avi -c:v libxvid -b:v 3000k -c:a libmp3lame -b:a 128k MON_DVD_A_MOI-2.avi
On peut également faire une extraction en deux passes avec l’option -pass (paraît que la qualité est meilleure, j’avoue ne pas voir la différence) :
$ avconv -y -i MON_DVD_A_MOI.vob -t 00:10:02 -pass 1 -f avi -c:v libxvid -b:v 3000k -an /dev/null
[ul][li]-y : on écrase les fichiers existants (le fichier de log en fait) sans demander[/li]
[li]-an : on ne tient pas compte du flux audio[/li]
[li]/dev/null : on ne sauvegarde pas le fichier généré, on a juste besoin du fichier de log[/li][/ul]
Puis pour la seconde passe :
$ avconv -i MON_DVD_A_MOI.vob -t 00:10:02 -pass 2 -f avi -c:v libxvid -b:v 3000k -c:a libmp3lame -b:a 128k MON_DVD_A_MOI-1.avi
On doit pouvoir facilement scripter ça en bash, ou avec un alias, pour éviter de retenir les commandes, mais je n’ai pas vraiment eu le temps de m’y plonger, peut être pour plus tard !
Amusez-vous bien !
Pour info, le temps d’encodage, sur mon portable Core i5 @ 2.5 GHz est de :
[ul][li] moins de 2 minutes pour une passe et 10 minutes[/li]
[li] moins de 4 minutes pour deux passes et 10 minutes[/li][/ul]
Je n’ai pas pensé à chronométrer l’extraction par vobcopy
J’ai vu qu’il y a une ébauche d’article sur le wiki, je le complète dès que j’ai un peu de temps.
Usti
EDIT 1 : ajout lien lbdvdcss sur Debian Multimédia
EDIT 2 : francisation suite suggestion ggoodluck47