Réponses:
Pour extraire le .VOB du titre 2, chapitre 3
Notez que '-chapitre 3' et '-chapter 3-' copiera du chapitre 3 à la fin, et si le numéro de chapitre que vous spécifiez n'est pas valide, l'option est ignorée et copiera donc le titre complet.
# physical DVD
mplayer dvd://2 -chapter 3-3 -dumpstream -dumpfile ~/3.VOB
# DVD .iso image
mplayer dvd://2 -dvd-device "$dvd_iso" -chapter 3-3 -dumpstream -dumpfile ~/3.VOB
Vous pouvez utiliser lsdvd
pour répertorier le titre, le chapitre, la cellule, l'audio, la vidéo, etc. pour un DVD physique. Cependant, il ne semble pas (?) Avoir un moyen de traiter a .iso
. Vous pouvez monter un .iso , si besoin est.
# count Titles, and count Cells per title.
# eg. ${cell[1]} is the Count of Cells for the first title
# ${cell[titles]} is the Count of Cells for the last title
eval $(lsdvd | sed -n 's/Title: \([0-9]\+\), .* Chapters: \([0-9]\+\), Cells: .*/cells[$((10#\1))]=$((10#\2));/p')
titles=${#cells[@]}
title_num=2
from_cell=1
to_cell=${cell[title_num]}
dvdxchap
, d'autre part, peut traiter un .iso
, mais il ne répertorie pas les informations de titre. Vous pouvez cependant spécifier le titre à partir duquel vous souhaitez obtenir des informations sur le chapitre.
title_num=2
from_cell=1
# physical DVD
to_cell="$(dvdxchap -t $title_num /dev/dvd | sed -n 's/^CHAPTER\([0-9]\+\).*/\1/p' | sed -n '$p')"
# DVD .iso image
to_cell="$(dvdxchap -t $title_num "$dvd_iso"| sed -n 's/^CHAPTER\([0-9]\+\).*/\1/p' | sed -n '$p')"
Lorsque vous connaissez le numéro de titre souhaité et que vous connaissez le nombre de cellules, vous pouvez les vider en boucle:
# physical DVD
for ((c=$from_cell; c<$to_cell; c++)) ;do
mplayer dvd://$title_num -chapter $c-$c -dumpstream -dumpfile ~/$c.VOB
done
# DVD .iso image
for ((c=$from_cell; c<$to_cell; c++)) ;do
mplayer dvd://$title_num -dvd-device "$dvd_iso" -chapter $c-$c -dumpstream -dumpfile ~/$c.VOB
done
En tant que script utilisant lsdvd
Python et ffmpeg
pour extraire les chapitres d'un DVD dans le répertoire courant ( extract-chapters.sh
):
#!/bin/sh
_genpy () {
if [ -n "$2" ]; then
lsdvd -x -Oy -t "$2" "$1"
else
lsdvd -x -Oy "$1"
fi
# Process in Python
cat <<EOF
for t in lsdvd['track']:
for c in t['chapter']:
print '{}\t{}\t{}\t{}'.format(t['vts'], t['ix'], c['ix'], c['length'])
EOF
}
_genpy "$@" 2> /dev/null | python | {
dvd_pos=0
while read line
do
dvd_file=$(printf '%02d' $(echo "$line" | cut -f1))
dvd_tr=$(echo "$line" | cut -f2)
dvd_cp=$(echo "$line" | cut -f3)
dvd_len=$(echo "$line" | cut -f4)
file_name="${dvd_tr}.${dvd_cp}.mkv"
cat "$1/VIDEO_TS/VTS_${dvd_file}"_*.VOB | ffmpeg -ss "$dvd_pos" -i - -t "$dvd_len" -c:v libvpx -c:a libvorbis -loglevel error "$file_name"
echo "Created $file_name"
dvd_pos=$(echo "$dvd_pos + $dvd_len" | bc)
done
}
Usage:
sh extract-chapters.sh PATH_TO_DVD_CONTENTS [TRACK]
lsdvd
Python, et ffmpeg
parce que tous ceux-ci sont venus dans les référentiels OSS de la distribution; d' autres outils proviennent de référentiels tiers (par exemple dvdbackup
, makemkv
, etc.).
dvdxchap
fait partie duogmtools
package.