![DVDのチャプターを個別のファイルにリッピングする](https://rvso.com/image/23930/DVD%E3%81%AE%E3%83%81%E3%83%A3%E3%83%97%E3%82%BF%E3%83%BC%E3%82%92%E5%80%8B%E5%88%A5%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%83%AA%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B.png)
子供向けアニメの DVD を持っていますが、それぞれの DVD にいくつかのエピソードが入っています。各エピソードが別々のファイルになるようにリッピングするにはどうすればよいでしょうか。DVD では、各エピソードが 1 つのタイトル内のチャプターとして書き込まれていると思います。
答え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
物理DVDのタイトル、チャプター、セル、オーディオ、ビデオなどを一覧表示するために使用できますlsdvd
。ただし、を処理する方法はないようです.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、およびを使用してffmpeg
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]