Rippen Sie Kapitel einer DVD in separate Dateien

Rippen Sie Kapitel einer DVD in separate Dateien

Ich habe eine DVD mit Zeichentrickfilmen für Kinder und auf jeder davon sind mehrere Episoden. Wie kann ich sie so rippen, dass jede Episode in einer separaten Datei ist? Ich glaube, jede Episode ist als Kapitel innerhalb eines Titels auf der DVD geschrieben.

Antwort1

So extrahieren Sie die .VOB-Datei für Titel 2, Kapitel 3

Beachten Sie, dass mit „-Kapitel 3“ und „-Kapitel 3-“ von Kapitel 3 bis zum Ende kopiert wird. Wenn die angegebene Kapitelnummer ungültig ist, wird die Option ignoriert und daher der vollständige Titel kopiert.

# 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  

Sie können lsdvdTitel, Kapitel, Zelle, Audio, Video usw. für eine physische DVD auflisten. Es scheint jedoch keine Möglichkeit zu geben, eine zu verarbeiten .iso. Sie könntenMounten Sie eine ISO-Datei, falls erforderlich.

# 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]}

dvdxchapkann dagegen ein verarbeiten .iso, listet aber keine Titelinformationen auf. Sie können jedoch den Titel angeben, von dem Sie Kapitelinformationen wünschen.

  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')"   

Wenn Sie die gewünschte Titelnummer und die Anzahl der Zellen kennen, können Sie sie in einer Schleife ausgeben:

# 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

Antwort2

Als Skript lsdvd, das Python verwendet, ffmpegum die Kapitel einer DVD in das aktuelle Verzeichnis ( extract-chapters.sh) zu extrahieren:

#!/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
}

Verwendung:

sh extract-chapters.sh PATH_TO_DVD_CONTENTS [TRACK]

verwandte Informationen