나는 각각 여러 에피소드로 구성된 어린이 만화 DVD를 가지고 있습니다. 각 에피소드가 별도의 파일에 있도록 어떻게 추출할 수 있나요? 내 생각엔 각 에피소드가 DVD 타이틀의 한 장으로 쓰여진 것 같아요.
답변1
Title 2 Chapter 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
.mount.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
반면, a는 처리가 가능 .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
ffmpeg
Python을 사용하고 DVD에서 현재 디렉토리( )로 챕터를 추출하는 스크립트 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]