Copiar capítulos de un DVD para separar archivos

Copiar capítulos de un DVD para separar archivos

Tengo un DVD con dibujos animados para niños y hay un par de episodios de cada uno de ellos. ¿Cómo puedo copiarlos de manera 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.

Respuesta1

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

Tenga en cuenta que '-chapter 3' y '-chapter 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, se 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 utilizar lsdvdpara enumerar el título, capítulo, celda, audio, vídeo, etc. de un DVD físico. Sin embargo, no parece (?) tener una forma de procesar un archivo .iso. Tú podríasmontar 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 incluye información del título. Sin embargo, puede especificar el título del que desea obtener 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 sepa el número de título que desea y sepa la cantidad 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

Respuesta2

Como script que usa lsdvdPython y ffmpegpara extraer los capítulos de 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]

información relacionada