Copie capítulos de um DVD para arquivos separados

Copie capítulos de um DVD para arquivos separados

Tenho um DVD com desenhos infantis e há alguns episódios de cada um deles. Como posso copiá-los de forma que cada episódio fique em um arquivo separado? Acho que cada episódio é escrito como um capítulo dentro de um título do DVD.

Responder1

Para extrair o .VOB para o Título 2, Capítulo 3

Observe que '-chapter 3' e '-chapter 3-' serão copiados do capítulo 3 até o final e, se o número do capítulo especificado for inválido, a opção será ignorada e, portanto, copiará o 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  

Você pode usar lsdvdpara listar título, capítulo, célula, áudio, vídeo, etc. para um DVD físico. No entanto, não parece (?) haver uma maneira de processar um arquivo .iso. Você poderiamonte um .iso, se necessário.

# 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 outro lado, pode processar um .iso, mas não lista as informações do título. Você pode, no entanto, especificar o título do qual deseja informações do 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')"   

Quando você souber o número do título desejado e o número de células, poderá despejá-las em um loop:

# 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

Responder2

Como um script que usa lsdvd, Python, e ffmpegpara extrair os capítulos de um DVD para o diretório atual ( 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]

informação relacionada