Câu trả lời:
Để trích xuất .VOB cho Tiêu đề 2, Chương 3
Lưu ý rằng '-CHAP 3' và '-ch CHƯƠNG 3-' sẽ sao chép từ chương 3 đến cuối và nếu số chương bạn chỉ định không hợp lệ, tùy chọn sẽ bị bỏ qua và do đó sẽ sao chép tiêu đề đầy đủ.
# 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
Bạn có thể sử dụng lsdvd
để liệt kê tiêu đề, chương, ô, âm thanh, video, v.v. cho DVD vật lý. Tuy nhiên, dường như không có cách nào để xử lý a .iso
. Bạn có thể gắn một .iso , nếu cần.
# 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
mặt khác, có thể xử lý một .iso
, nhưng nó không liệt kê thông tin tiêu đề. Tuy nhiên, bạn có thể chỉ định tiêu đề mà bạn muốn thông tin chương.
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')"
Khi bạn biết số tiêu đề bạn muốn và biết số lượng ô, bạn có thể kết xuất chúng trong một vòng lặ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
Là một tập lệnh sử dụng lsdvd
, Python và ffmpeg
để trích xuất các Chương trong DVD sang thư mục hiện tại ( 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
}
Sử dụng:
sh extract-chapters.sh PATH_TO_DVD_CONTENTS [TRACK]
lsdvd
, Python và ffmpeg
vì tất cả các công cụ này đều có trong kho OSS của bản phân phối; các công cụ khác đến từ kho của bên thứ ba (ví dụ dvdbackup
, makemkv
vv).
dvdxchap
là một phần củaogmtools
gói.