Extraer capítulos de un DVD para separar archivos

8

Tengo un DVD con dibujos animados para niños y hay un par de episodios en cada uno de ellos. ¿Cómo puedo extraerlos para que cada episodio esté en un archivo separado? Creo que cada episodio está escrito como un capítulo dentro de un título en el DVD.

Grzenio
fuente

Respuestas:

10

Para extraer el .VOB para el Título 2, Capítulo 3

Tenga en cuenta que '-capítulo 3' y '-capítulo 3-' se copiarán desde el capítulo 3 hasta el final, y si el número de capítulo que especifica no es válido, la opción se ignora y, por lo tanto, copiará el título completo.

# 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  

Puede usar lsdvdpara enumerar títulos, capítulos, celdas, audio, video, etc. para un DVD físico. Sin embargo, no parece (?) Tener una manera de procesar a .iso. Podrías montar un .iso , si es necesario.

# 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, por otro lado, puede procesar un .iso, pero no enumera la información del título. Sin embargo, puede especificar el título del que desea información del capítulo.

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

Cuando conoce el número de título que desea y conoce el número de celdas, puede volcarlas en un bucle:

# 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
fuente
En Ubuntu dvdxchapes parte del ogmtoolspaquete.
Eborbob
0

Como script que usa lsdvdPython, y ffmpegpara extraer los Capítulos en un DVD al directorio actual ( 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
}

Uso:

sh extract-chapters.sh PATH_TO_DVD_CONTENTS [TRACK]
palswim
fuente
Para las herramientas que no son POSIX, elegí lsdvdPython, y ffmpegporque todas ellas vinieron en los repositorios OSS de la distribución; otras herramientas procedían de repositorios de terceros (por ejemplo dvdbackup, makemkv, etc.).
palswim