Skript: DVD/Video in XVID umwandeln

Online seit Thu 27 January 2011 in Digital

Vor einiger Zeit habe ich hier beschrieben, wie man einfach ein oder mehrere Videos in XVID umwandeln kann, damit sie auch ein DVD-Player abspielen kann.

Mein Skript habe ich ein wenig verbessert:

  1. man kann direkt den ersten Titel einer DVD rippen und umrechnen lassen wenn man als ersten Parameter dvd eingibt. So kann man Aufnahmen einfach archivieren.
  2. Schwarze Balken werden automatisch abgeschnitten. Das spart Größe und verbessert die Qualität. Dazu habe ich dieses Skript in meines integriert.
  3. Die Bitrate habe ich ein bisschen nach oben geschraubt.

Ansonsten ist die Benutzung gleich geblieben.  Also Skript runterladen - ausführbar machen und mit

./Video2xvid video1 video2 video3

oder

./Video2xvid dvd

starten.

Hier das Skript (Download: Video2xvid_update.tar.gz):

#!/bin/bash
#Lösche logdatei um Störungen zu vermeiden
rm -v divx2pass.log
Gesamtdauer=0
while [ ${1} != '' ]
do
if [ "$1" = "dvd" ]; then
echo "Filmname eingeben:"
read Filmname
mplayer -dvd-device /dev/sr0 dvd://1 -v -dumpstream -dumpfile $Filmname.vob
set "$Filmname.vob"
fi
###Bestimme Breite
BREITE=`mplayer -identify "$1" -ao null -vo null -frames 0 2>/dev/null | grep ^ID_VIDEO_WIDTH | cut -c16-`; echo "Orginalbreite= $BREITE"
if [ $BREITE -le 720 ]; then
VBREITE=$BREITE
else
VBREITE=720
fi

###Bestimme Höhe
HOEHE=`mplayer -identify "$1" -ao null -vo null -frames 0 2>/dev/null | grep ^ID_VIDEO_HEIGHT | cut -c17-`; echo "Orginalhöhe= $HOEHE"
CROPHOEHE=$((HOEHE-8)); echo "Crophöhe -$CROPHOEHE-"

####### Crop
TOTAL_LOOPS="40"
NICE_PRI="10"

######### CROP Settings #############

echo "Please wait.  It make take a couple minutes to detect crop parameters."
A=20
while [ "$A" -lt "$TOTAL_LOOPS" ] ; do
A="$(( $A + 1 ))"
SKIP_SECS="$(( 35 * $A ))"

nice -n $NICE_PRI nohup mplayer $1 -ss $SKIP_SECS -identify -frames 20 -vo md5sum -ao null -nocache -vf crop=$BREITE:$CROPHOEHE:0:8,cropdetect=20:2 2>&1 > mplayer.log < /dev/null

# echo DEBUG ; cat mplayer.log

CROP[$A]=`awk -F 'crop=' '/crop/ {print $2}' < mplayer.log| awk -F ')' '{print $1}' | tail -n 1`
echo "A= ${CROP[$A]}"

done
rm md5sums mplayer.log

B=20
while [ "$B" -lt "$TOTAL_LOOPS" ] ; do
B="$(( $B + 1 ))"
echo "B= ${CROP[$B]}"
C=20
while [ "$C" -lt "$TOTAL_LOOPS" ] ; do
C="$(( $C + 1 ))"

if [ "${CROP[$B]}" == "${CROP[$C]}" ] ; then
COUNT_CROP[$B]="$(( ${COUNT_CROP[$B]} + 1 ))"
fi
done
done

HIGHEST_COUNT=0

D=20
while [ "$D" -lt "$TOTAL_LOOPS" ] ; do
D="$(( $D + 1 ))"

if [ "${COUNT_CROP[$D]}" -gt "$HIGHEST_COUNT" ] ; then
HIGHEST_COUNT="${COUNT_CROP[$D]}"
GREATEST="$D"
fi
done

CROP="${CROP[$GREATEST]}"

echo -e "\n\nCrop Setting is: $CROP ... \n\n"
####Crop-Ende##

# Bestimme Audio-Codec
ACODEC=`mplayer -identify "$1" -ao null -vo null -frames 0 2>/dev/null | grep ^ID_AUDIO_CODEC | cut -c16-`; echo "Audiocodec= $ACODEC"
if [ "$ACODEC" == "a52" -o "$ACODEC" == "faad" ]; then
AOPTS="lavc -lavcopts acodec=ac3"
#"lavc -lavcopts acodec=ac3:abitrate=192 -af volnorm=1"
else
AOPTS="mp3lame -lameopts abr:br=196 -af lavcresample=44100,volnorm=1"
fi

#Bestime Bitrate
RATE=`mplayer -identify "$1" -ao null -vo null -frames 0 2>/dev/null | grep ^ID_VIDEO_BITRATE | cut -c18-`;
echo "Orginalbitrate= $RATE"
if [ $RATE == 0 ]; then
BRATE=900
else
if [ $RATE -le 1500000 ]; then
BRATE=$((RATE/1000))
else
BRATE=900
fi
fi

# Bestimme Namen
NAME=`echo "$1" | sed 's/\.[^\.]*$//'`; echo $NAME

#Bestimme Startzeit
START=$(date +"%s");

#Starte Codieren
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo "Encodiere $1 in $NAME-xvid.avi"
echo
echo "Beginne mit erstem Durchgang"
echo
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
mencoder  -ffourcc XVID -oac $AOPTS -ovc xvid -xvidencopts pass=1:trellis:hq_ac -vf crop=$BREITE:$CROPHOEHE:0:8,crop=$CROP,scale=$VBREITE:-3 -o /dev/null $1

echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo "Nun folgt Durchgang Nummer Zwei"
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
mencoder  -ffourcc XVID -oac $AOPTS -af lavcresample=44100,volnorm=1 -ovc xvid -xvidencopts pass=2:bitrate=$BRATE:hq_ac:trellis:chroma_opt:vhq=2:bvhq=1:quant_type=mpeg -vf crop=$BREITE:$CROPHOEHE:0:8,crop=$CROP,scale=$VBREITE:-3 -o $NAME-xvid.avi $1

#Berechne Dauer
ENDE=$(date +"%s");
DAUER=$(((ENDE-START)/60));
echo "************************************"
echo "**Encodieren in XVID abgeschlossen**"
echo "**                                **"
echo "** es dauerte ca. $DAUER Minuten     **"
echo "************************************"
echo
Gesamtdauer=$((Gesamtdauer+DAUER))

# Aufräumen
echo -e "Logdatei wird gelöscht"
rm -v divx2pass.log

# Auswahl anzeigen
echo "Soll Orginaldatei gelöscht werden [y/n]"
echo "Nach 25 Sekunden ohne Eingabe wird ohne Löschen beendet"
read -t 25 -n 1 TASTE
if [ "$TASTE" == "y" ] ; then
echo "Lösche $1"
rm -f $1
shift
else
shift
fi
done
# Beenden
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo
echo "Encodieren beendet"
echo
echo "Gesamtdauer ca. $Gesamtdauer Minuten"
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"