Liomans Blog

42 ist die Antwort – aber wie lautet die Frage?


Artikelbild

Script: Videos in XVID encodieren

| 0 comments

Platzsparende Videocodecs wie x264 verpackt in einem MP4-Container bieten hochqualitative Videos bei kleiner Größe. So ist es nicht verwunderlich, dass Videos mit diesem Format im Netz weit verbreitet sind. Das Problem dabei: Viele Standaloneplayer können es nicht lesen. Man muss also umencodieren.

Da ich immer mal wieder Videos in verschiedensten Formaten aus dem Netz lade, sie aber mit dem DVD-Recorder anschauen möchte, habe ich ein kleines Script geschrieben, dass alles automatisch erledigt.

Der Player kann wie die meisten XVID/DIVX – Avicontainer lesen. Es sollen also alle Videos in dieses Format überführt werden. Das Problem: Es gibt viele verschiedene Quellen und Qualitätsstufen. HDTV-Videos wie HOME über Legaltorrents.com (Sehr groß, mp4, aac), Youtube/ Vimeo videos (kleine flv, zT. HQ-Videos/mp4) , Streammitschnitte (unterschiedlicher Ausführung) und natürlich TV-Mitschnitte in DVD-Qualität. Die verschieden Quellen sollen alle jeweils so optimal wie möglich verarbeitet werden und von Hand ist es viel zu viel Arbeit.

Ich möchte als Ergebnis eine möglichst hohe Qualität haben, bei vernünftiger Videogröße und natürlich absoluter Kompatibilität.

Dazu folgende Erkenntnis: Das Ergebnis wird nie besser als die Quelle werden. Es macht also keinen Sinn aus einem kleinen *.flv-Video ein 1280×720-Video mit ac3-Sound und einer Bitrate von 1000 zu machen. Andererseits kann der Player nicht mit zu Großen Bildern umgehen und ich will ja auch Platz sparen.

Was macht das Script:

  1. Quelle prüfen
  2. Qualität festsetzen
    nicht besser als Quelle aber höchstens 720 in der Breite bei einer Bitrate von 750
  3. 2-pass-Encodieren und danach aufräumen

Wie nutzt man das Script?

  1. runterladen
  2. entpacken
    1. chmod +x #(Ausfuehrbar machen)
    chmod +x #(Ausfuehrbar machen)
    1. ./Video2xvid video1 video2 video3
    ./Video2xvid video1 video2 video3

  3. Das Script Encodiert alle Videos nacheinander

Über Vorschläge zur verbesserung des Scriptes oder Fragen nach Hilfe freue ich mich.

Nun das Script, ich hoffe ich habe es ausreichend kommentiert:

(Weiter unten nochmal als Download)

  1. #!/bin/bash
  2. #Lösche logdatei um Störungen zu vermeiden
  3. rm -v divx2pass.log
  4. Gesamtdauer=0
  5. while [ ${1} != '' ]
  6.   do
  7. #Bestimme Breite
  8. BREITE=`mplayer -identify \$1\ -ao null -vo null -frames 0 2>/dev/null | grep ^ID_VIDEO_WIDTH | cut -c16-`; echo \Orginalbreite= $BREITE\
  9. if [ $BREITE -le 720 ]; then
  10. VBREITE=$BREITE
  11. else
  12. VBREITE=720
  13. fi
  14.  
  15. # Bestimme Audio-Codec
  16. ACODEC=`mplayer -identify \$1\ -ao null -vo null -frames 0 2>/dev/null | grep ^ID_AUDIO_CODEC | cut -c16-`; echo \Audiocodec= $ACODEC\
  17. if [ \$ACODEC\ == \a52\ -o \$ACODEC\ == \faad\ ]; then
  18. AOPTS=\lavc -lavcopts acodec=ac3 -af volnorm=1\
  19. else
  20. AOPTS=\mp3lame -lameopts abr:br=196 -af lavcresample=44100,volnorm=1\
  21. fi
  22.  
  23. #Bestime Bitrate
  24. RATE=`mplayer -identify \$1\ -ao null -vo null -frames 0 2>/dev/null | grep ^ID_VIDEO_BITRATE | cut -c18-`;
  25. echo \Orginalbitrate= $RATE\
  26. if [ $RATE == 0 ]; then
  27.     BRATE=750
  28.     else
  29.     if [ $RATE -le 800000 ]; then
  30.         BRATE=$((RATE/1000))
  31.         else
  32.         BRATE=750
  33.     fi
  34. fi
  35.  
  36. # Bestimme Namen
  37. NAME=`echo \$1\ | sed 's/\.[^\.]*$//'`; echo $NAME
  38.  
  39. #Bestimme Startzeit
  40. START=$(date +\%s\);
  41.  
  42. #Starte Codieren
  43. echo \~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\
  44. echo \Encodiere $1 in $NAME-xvid.avi\
  45. echo
  46. echo \Beginne mit erstem Durchgang\
  47. echo
  48. echo \~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\
  49. mencoder  -ffourcc XVID -oac $AOPTS -ovc xvid -xvidencopts pass=1:trellis:hq_ac -vf scale=$VBREITE:-3 -o /dev/null $1
  50.  
  51. echo \~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\
  52. echo \Nun folgt Durchgang Nummer Zwei\
  53. echo \~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\
  54. 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 scale=$VBREITE:-3 -o $NAME-xvid.avi $1
  55.  
  56. #Berechne Dauer
  57. ENDE=$(date +\%s\);
  58. DAUER=$(((ENDE-START)/60));
  59. echo \************************************\
  60. echo \**Encodieren in XVID abgeschlossen**\
  61. echo \**                                **\
  62. echo \** es dauerte ca. $DAUER Minuten     **\
  63. echo \************************************\
  64. echo
  65. Gesamtdauer=$((Gesamtdauer+DAUER))
  66.  
  67. # Aufräumen
  68. echo -e \Logdatei wird gelöscht\
  69. rm -v divx2pass.log
  70.  
  71. # Auswahl anzeigen
  72. echo \Soll Orginaldatei gelöscht werden [y/n]\
  73. echo \Nach 15 Sekunden ohne Eingabe wird ohne Löschen beendet\
  74. read -t 15 -n 1 TASTE
  75. if [ \$TASTE\ == \y\ ] ; then
  76. echo \Lösche $1\
  77. rm -f $1
  78. shift
  79. else
  80. shift
  81. fi
  82. done
  83. # Beenden
  84. echo \~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\
  85. echo
  86. echo \Encodieren beendet\
  87. echo
  88. echo \Gesamtdauer ca. $Gesamtdauer Minuten\
  89. echo \~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\
#!/bin/bash
#Lösche logdatei um Störungen zu vermeiden
rm -v divx2pass.log
Gesamtdauer=0
while [ ${1} != '' ]
  do
#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 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 -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=750
	else
	if [ $RATE -le 800000 ]; then
		BRATE=$((RATE/1000))
		else
		BRATE=750
	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 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 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 15 Sekunden ohne Eingabe wird ohne Löschen beendet\
read -t 15 -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 \~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\

Und hier die Datei zum Download: Video2xvid.tar.gz

Diesen Artikel weiterempfehlen:



Diese Artikel könnten dich auch interessieren:

Leave a Reply

Required fields are marked *.

*


This Blog will give regular Commentators DoFollow Status. Implemented from IT Blögg