DVD의 챕터를 리핑하여 파일 분리

DVD의 챕터를 리핑하여 파일 분리

나는 아이들을 위한 만화가 담긴 DVD를 가지고 있는데, 그 각각에는 두어 개의 에피소드가 들어있습니다. 모든 에피소드가 별도의 파일에 있도록 어떻게 추출할 수 있나요? 내 생각엔 모든 에피소드가 DVD의 한 타이틀 안에 챕터로 쓰여진 것 같아요.

답변1

제목 2, 3장에 대한 .VOB를 추출하려면

'-chapter 3' 및 '-chapter 3-'은 3장부터 끝까지 복사하며, 지정한 장 번호가 유효하지 않은 경우 옵션이 무시되므로 전체 제목이 복사됩니다.

# 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  

lsdvd실제 DVD의 제목, 장, 셀, 오디오, 비디오 등을 나열하는 데 사용할 수 있습니다 . 그러나 .iso. 당신은 할 수.iso 마운트, 필요하다면.

# 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는 반면에 을(를) 처리할 수 있지만 .iso제목 정보는 나열하지 않습니다. 그러나 장 정보를 원하는 제목을 지정할 수 있습니다.

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

원하는 제목 번호와 셀 수를 알고 있으면 루프에서 해당 셀을 덤프할 수 있습니다.

# 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

답변2

lsdvd, Python을 사용하고 ffmpegDVD의 챕터를 현재 디렉터리( 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
}

용법:

sh extract-chapters.sh PATH_TO_DVD_CONTENTS [TRACK]

관련 정보