Extraire des chapitres d'un DVD pour séparer des fichiers

8

J'ai un DVD avec des dessins animés pour les enfants et il y a quelques épisodes sur chacun d'eux. Comment puis-je les extraire de telle sorte que chaque épisode soit dans un fichier séparé? Je pense que chaque épisode est écrit comme un chapitre dans un titre sur le DVD.

Grzenio
la source

Réponses:

10

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 lsdvdpour 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
Peter.O
la source
Sur Ubuntu dvdxchapfait partie du ogmtoolspackage.
Eborbob
0

En tant que script utilisant lsdvdPython et ffmpegpour 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]
palswim
la source
Pour les outils non POSIX, j'ai choisi lsdvdPython, et ffmpegparce 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.).
palswim