shellscripts:encode

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
shellscripts:encode [2006/12/17 17:59] stshellscripts:encode [2006/12/17 22:08] (aktuell) st
Zeile 1: Zeile 1:
 +====== Encodieren mit mplayer ======
 +Das Shellscript bietet eine menugeführte Auswahl der Zielcodes an (divx-kompatibel+mp3 bzw. ogg theora und ogg audio) und schreibt dann die (neu)kodierte Datei an den gewünschten Zielort.
  
 +Als Vorraussetzung wird bc bzw. xdialog benötigt sowie die entsprechenden Codecs. Die Lizensierung ist unter der GPL.
 +
 +Die Theorakompression funktioniert nicht aus allen Formaten heraus (mpeg2 funzt z.B. nicht).
 +
 +<code bash>
 +#!/bin/bash
 +
 +#part of the Mutils by Paul Hänsch
 +#to be ditributed under the terms of the GPL v.2 and any later version
 +
 +frontend=Xdialog
 +terminal="xterm -e "
 +
 +mb=2 #makroblock decision algorythm
 +keys=30 #keyframe interval
 +thresh=0 #scenechange threshold (-1000000=every frame is a keyframe; 1000000=no keyframes out of interval)
 +
 +#if more than one file is opened at once in konqueror, one instance of the script 
 +#will be opened for every file - this if-else stuff passes all files to the first
 +#instance of the script (using the fifo "/tmp/encode.list")
 +if [ -e /tmp/encode.list ]; then
 + echo \#$1 >>/tmp/encode.list
 + exit 0
 +else
 + mkfifo /tmp/encode.list
 + echo \#$1 >>/tmp/encode.list &
 + sleep 3
 + files=`cat /tmp/encode.list`
 + rm /tmp/encode.list
 + 
 + #I cannot control in which order the files are given, that's why I sort them
 + files=`echo $files |sed '/#/s//\n#/g'|sort`
 + #The filenames must be translated into a format which mplayer understands
 + #I also try to translate the damn kde-media:-protocol path but that's very
 + #simple yet and may not work on your system
 + files=`echo $files |sed '/media:\/hdc/s//\/mnt\/cdrom/g;/-/s//\\-/g;/ #/s//#/g;/ /s//\\ /g'`
 + 
 + #now we are going to ask some questiones
 + #the file /tmp/querrys catches the output of dialog
 + $frontend --radiolist "Ausgabeformat:" 0 0 0 "avi" "Video: DivX5-kompatibel; Audio: mp3" on "OGM" "Video: Ogg Theora      ; Audio: Ogg Vorbis" off 2>/tmp/querrys
 + if [ $? == 1 ];then
 +  rm /tmp/querrys
 +  exit 0
 + fi
 + format=`cat /tmp/querrys`
 +
 + $frontend --inputbox "Videobitrate:" 0 0 800 2>/tmp/querrys
 + if [ $? == 1 ];then
 +  rm /tmp/querrys
 +  exit 0
 + fi
 + vrate=`cat /tmp/querrys`
 + 
 + $frontend --inputbox "Audiobitrate:" 0 0 128 2>/tmp/querrys
 + if [ $? == 1 ];then
 +  rm /tmp/querrys
 +  exit 0
 + fi
 + arate=`cat /tmp/querrys`
 + 
 + text="Ich kann das Videobild an den Rändern zurecht schneiden um z.B.\n
 +schwarze Streifen los zu werden. Geben Sie hier die Schnitt-\n
 +koordinaten in der Form\n\n
 +breite:höhe:x:y\n\n
 +an, wobei x und y die Abstände zu den Rändern sind. Sie können\n
 +x und y auch weglassen um den Bildausschnitt zu zentrieren."
 + stat=3
 + crop="breite:höhe:x:y"
 + while [ $stat == 3 ]; do
 +  if [ $frontend == dialog ]; then
 +   $frontend --extra-button --extra-label "Testen" --inputbox "$text" 0 0 "$crop" 2>/tmp/querrys
 +   stat=$?
 +  else
 +   $frontend --check "erst testen" on --inputbox "$text" 0 0 "$crop" 2>/tmp/querrys
 +   stat=$?
 +   grep "unchecked" /tmp/querrys || stat=3
 +  fi
 +  crop=`grep ":" /tmp/querrys`
 +  if [ $stat == 3 ]; then
 +   mplayer "`echo $files |cut -d "#" -f2`" -vf rectangle=$crop
 +  fi
 +  if [ $stat == 1 ];then
 +   rm /tmp/querrys
 +   exit 0
 +  fi
 + done
 + #refomatting crop-data for use with ffmpeg2theora
 +  #get data
 +  mplayer "`echo $files |cut -d "#" -f2`" -vo null -ao null -frames 1 -identify 2>/tmp/querrys
 +  vw=`cat /tmp/querrys |grep "ID_VIDEO_WIDTH=" |cut -d "=" -f2`
 +  vh=`cat /tmp/querrys |grep "ID_VIDEO_HEIGHT=" |cut -d "=" -f2`
 +  cw=`echo $crop |cut -d ":" -f1`
 +  if [ -z $cw ]; then 
 +   cw=$vw
 +  fi
 +  ch=`echo $crop |cut -d ":" -f2`
 +  if [ -z $ch ]; then
 +   ch=$vh
 +  fi
 +  cx=`echo $crop |cut -d ":" -f3`
 +  cy=`echo $crop |cut -d ":" -f4`
 +  #calculate params
 +  if [ -z $cx ]; then
 +   cl=`expr \( $vw - $cw \) / 2`
 +   cr=$cl
 +  else
 +   cl=$cx
 +   cr=`$vw - \( $cx + $cw \)`
 +  fi
 +  if [ -z $cy ]; then
 +   ct=`expr \( $vh - $ch \) / 2`
 +   cb=$ct
 +  else
 +   ct=$cy
 +   cb=`$vh - \( $cy + $ch \)`
 +  fi
 +  cropTH=`echo "--croptop $ct --cropleft $cl --cropbottom $cb --cropright $cr"`
 +
 + #calculate scale of image
 + width=`echo $crop |cut -d ":" -f1`
 + height=`echo $crop |cut -d ":" -f2`
 + echo "scale=6" >/tmp/querrys
 + echo "sqrt( 128000 / ( $width * $height ) )" >>/tmp/querrys
 + echo "quit" >>/tmp/querrys
 + scale=`bc -q /tmp/querrys`
 + width=`echo "$scale * $width" |bc |cut -d "." -f1`
 + height=`echo "$scale * $height" |bc |cut -d "." -f1`
 + scale=`echo "$width:$height"`
 + 
 + text="Üblicherweise wird das Video für die Kompression auf ein\n
 +geignetes Größenverhältnis skaliert. Erfahrungsgemäß ist,\n
 +unabhängig vom Seitenverhältnis des Videos, eine Fläche von\n
 +etwa 128.000 Pixeln empfehlenswert. Ich habe die entsprechenden\n
 +Abmessungen unter Beibehaltung des Seitenverhältnisses\n
 +errechnet. Sie können jedoch eigene Abmessungen in der Form\n\n
 +breite:höhe\n\n
 +eingeben."
 + $frontend --inputbox "$text" 0 0 "$scale" 2>/tmp/querrys
 + if [ $? == 1 ];then
 +  rm /tmp/querrys
 +  exit 0
 + fi
 + scale=`cat /tmp/querrys`
 + vf=`echo "crop=$crop,scale=$scale"`
 +
 + #reformatting sclae params for ffmpeg2theora
 + width=`echo $scale |cut -d ":" -f1`
 + height=`echo $scale |cut -d ":" -f2`
 +
 + text="Geben Sie im folgenden Dialog den Zielpfad mit dem Präfix des\n
 +Dateinamens ein. Da Ich die Zieldateien durchnummeriere,\n
 +wird nur der Anfang des Dateinamens benötigt.\n
 +Das Benennungsschema ist:\n\n
 +[Pfad][Präfix]-{nummer}.$format\n\n
 +Geben sie nur den Teil an, der oben in eckigen Klammern steht."
 + $frontend --msgbox "$text" 0 0
 + 
 + prefix=~/
 + while [ -d $prefix ]; do
 +  $frontend --fselect "$prefix" 15 70 2>/tmp/querrys
 +  if [ $? == 1 ];then
 +   rm /tmp/querrys
 +   exit 0
 +  fi
 +  prefix=`cat /tmp/querrys`
 + done
 +
 + text="Die Folgenden Dateien werden Komprimiert:`echo $files |sed '/#/s//\n/g' |cat`\n\n
 +Die Zieldateien sind:
 +$prefix-{nummer}.$format\n\n
 +Videobitrate: $vrate kbps
 +Audiobitrate: $arate kbps\n\n
 +Skalierungsoptionen:
 +$vf\n\n
 +Es wird empfohlen die Kompression mit gesenkter Priorität
 +auszuführen um das System nicht gänzlich zu blockieren\n\n
 +Priorität       (0=normal, 20=geringste,
 +negative Prioritäten nur für Superuser):"
 +
 + $frontend --cr-wrap --ok-label " Hey, ho, let's go! " --inputbox "$text" 0 0 "5" 2>/tmp/querrys
 + if [ $? == 1 ];then
 +  rm /tmp/querrys
 +  exit 0
 + fi
 + prio=`cat /tmp/querrys`
 + 
 +
 + result=0
 + n=2
 + while [ ! -z "`echo $files |cut -d "#" -f$n`" ]; do
 +  infile=`echo $files |cut -d "#" -f$n`
 +  outfile="$prefix-`expr $n - 1`.$format"
 +  if [ $format == "avi" ]; then
 +   $terminal nice -n $prio mencoder "$infile" -o $outfile -vf $vf -ffourcc dx50 -oac mp3lame -lameopts mode=1:vbr=0:aq=0:br=$arate -ovc lavc -lavcopts vcodec=mpeg4:vme=5:mbd=$mb:vbitrate=$vrate:keyint=$keys:sc_threshold=$thresh:v4mv:vb_strategy=1:autoaspect:preme=2:dia=2
 +   result=`expr $result + $?`
 +  else
 +   $terminal nice -n $prio ffmpeg2theora -o '$outfile' -V $vrate -v 10 $cropTH -x $width -y $height --optimize -S 1 -K 30 -A $arate "$infile"
 +   result=`expr $result + $?`
 +  fi
 +  n=`expr $n + 1`
 + done
 + 
 + if [ $result == 0 ]; then
 +  $frontend --ok-label " Dankeschön " --msgbox "    Kompression(en) erfolgreich abgeschlossen.  " 6 53
 + else
 +  $frontend --ok-label " Tja! " --msgbox "Irgendwas ging schief.\n - sorry -" 0 0
 + fi
 +fi
 +</code>