NoPaste

dvd2mkv

von TRex

Dein Code:
  1. #!/bin/bash -e
  2.  
  3. # TODO doc
  4. #
  5. # Reencodes DVD structures to mkv using a local scratchdir
  6. #
  7. # All audio streams and subtitles are copied
  8. # Video is reencoded with x264 -profile slow -crf 22
  9.  
  10. # TODO:
  11. # - multiple video streams
  12. # - refining encoding process
  13. # - try to find subtitle language
  14.  
  15. # in case one wants to use avconv....
  16. FFMPEG=ffmpeg
  17.  
  18. function usage {
  19.         echo "Usage: $0 Moviefolder"
  20.         exit 1
  21. }
  22. [ "$#" == "1" ] || usage
  23.  
  24. export TMP_VID_DIR=/mnt/tmp
  25. VIDEO_DIR=$(readlink -f "$1")
  26.  
  27. function is_dvd {
  28.         if [ -d "$VIDEO_DIR/VIDEO_TS" ]; then
  29.                 return 0
  30.         else
  31.                 return 1
  32.         fi
  33. }
  34.  
  35. #
  36. function print {
  37.         echo $@ > /dev/null
  38. }
  39.  
  40. function finish {
  41.         print "exit code $? [$@]"
  42.         [ -f "$TMPVOB" ] && rm "$TMPVOB"
  43.         print .
  44. }
  45.  
  46. trap finish EXIT
  47.  
  48. function _process_dvd {
  49.         echo "Working on VIDEO_DIR $VIDEO_DIR"
  50.         echo "Folder recognized as $DIRNAME"
  51.         is_dvd || return 2
  52.  
  53.         pushd "$VIDEO_DIR/VIDEO_TS/"
  54.                 local d_path="$TMP_VID_DIR/$1"
  55.                 mkdir -p "$d_path"
  56.                 [ -L "$d_path/src" ] || ln -s "$VIDEO_DIR" "$d_path/src"
  57.                 local vobs=$(ls *.VOB | sort)
  58.                 TMPVOB="$d_path/movie.vob"
  59.                 local destfile="$d_path/movie.mkv"
  60.                 cat $vobs > "$TMPVOB"
  61.                
  62.                 $FFMPEG \
  63.                         -analyzeduration 2G -probesize 2G \
  64.                         -i "$d_path/movie.vob" \
  65.                         -map 0 -dn \
  66.                         -c:v libx264 -preset slow -crf 22 \
  67.                         -c:a copy \
  68.                         -c:s copy \
  69.                         "$destfile" || rm "$destfile"
  70.                 mv "$destfile" "$VIDEO_DIR"
  71.         popd
  72. }
  73.  
  74. if [ ! -d "$VIDEO_DIR" ] || ! is_dvd ; then
  75.         # "no (dvd) directory given"
  76.         exit 1
  77. fi
  78.  
  79. DIRNAME="$(basename "$VIDEO_DIR")"
  80.  
  81. [ ! -f "$VIDEO_DIR/movie.mkv" ] && is_dvd && _process_dvd "$DIRNAME"

Quellcode

Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. Alternativ kannst du den gesamten Eintrag auch als Datei herunterladen.