Tengo un DVD con dibujos animados para niños y hay un par de episodios de cada uno de ellos. ¿Cómo puedo copiarlos de manera que cada episodio esté en un archivo separado? Creo que cada episodio está escrito como un capítulo dentro de un título en el DVD.
Respuesta1
Para extraer el .VOB del Título 2, Capítulo 3
Tenga en cuenta que '-chapter 3' y '-chapter 3-' se copiarán desde el capítulo 3 hasta el final y, si el número de capítulo que especifica no es válido, la opción se ignora y, por lo tanto, se copiará el 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
Puede utilizar lsdvd
para enumerar el título, capítulo, celda, audio, vídeo, etc. de un DVD físico. Sin embargo, no parece (?) tener una forma de procesar un archivo .iso
. Tú podríasmontar un .iso, si es necesario.
# 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 otro lado, puede procesar un .iso
, pero no incluye información del título. Sin embargo, puede especificar el título del que desea obtener información del 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')"
Cuando sepa el número de título que desea y sepa la cantidad de celdas, puede volcarlas en un bucle:
# 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
Respuesta2
Como script que usa lsdvd
Python y ffmpeg
para extraer los capítulos de un DVD al directorio actual ( 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]