So, endlich geschafft: Um Videos für sein Handy umwandeln braucht es nur einen Befehl - zumindest unter Linux. Ohne umständliche GUI und mit einem kleinen Script ist die Arbeit schnell erledigt. Bei mir handelt es sich um ein Nokia 6120c (classic). Diese Anleitung sollte aber auch für andere Geräte funktionieren.
Video- und Audioformate finden
Als erstes muss man wissen, welche Videoformate sein Handy unterstüzt. Eine gute Anlaufstelle findet man dabei in der Heise.de Handygalerie. Man sucht sein Handy heraus und notiert sich die Formate, die das Handy abspielen kann. Idealerweise sind AAC und MPG4 als Audio- bzw. Videoformat vorhanden. Ansonsten muss evtl auf Formate wie mp3 oder gar pcm wave zurückgegriffen werden. Meine Favoriten vorbis und theora waren aber leider nicht dabei. Dafür komprimieren AAC und XviD besser. Außerdem ist XviD ebenfalls ein freier Codec, und auch mit faac gibt es eine freie Implementierung für die AAC-Kompression.
XviD? Haben wir nicht grad von MPG4 gesprochen? Ja! Es ist tatsächlich etwas konfus. MP(E)G4 ist nur ein Standard, nicht ein Codec selber. XviD ist dabei einer der effizientesten Kodierer. Ihr könnt aber auch Lavf zum kodieren nehmen, eurem Handy dürfte es egal sein - höchstens eurer Speicherkarte bzw. eurem Auge nicht.
Installation
Also wie nun umwandeln? Erstmal brauchen wir ffmpeg. Unter Ubuntu ist es ganz einfach zu installieren:sudo aptitude install ffmpeg libavcodec libavformat libavcodec-unstripped-51 libavdevice-unstripped-52 libavformat-unstripped-52 libavutil-unstripped-49 libpostproc-unstripped-51 libswscale-unstripped-0
Damit werden sehr viele Codecs installiert, die aber nur klein sind. Falls ihr sie mal braucht, sind sie jetzt schonmal installiert. Nun erstellt ihr euch ein Shellscript namens ~/bin/vid2mobile mit folgendem Inhalt:
#!/bin/bash
#
# Copyleft (ↄ) Benjamin M.;
# NO WRONGS RESERVED; KEEP THEM IF YOU FIND THEM!
#
# ----------------------------------------------------------------------------
# "THE BEER-WARE LICENSE" (Revision 42):
# Benjamin M. schrieb diese Datei. Solange Sie diesen Vermerk nicht entfernen,
# können Sie mit der Datei machen, was Sie möchten. Wenn wir uns eines Tages treffen
# und Sie denken, die Datei ist es wert, können Sie mir dafür ein Bier ausgeben.
# ----------------------------------------------------------------------------
#***************
#** VARIABLEN **
#***************
# Put your mobile's maximum width and height here
maxwidth=320
maxheight=240
# constants
newname=$(basename "$1" | sed 's/\..*$/_mobile\.mp4/g')
if [ -z "$1" ]; then
echo "No input specified - aborting!"
exit 1
elif [ "$1" == "$newname" ]; then
echo "Name collision - aborting"
exit 1
elif [ ! -e "$1" ]; then
echo "File not found - check your input"
exit 1
fi
# File detected, see if we find out it's resolution
res=$(ffmpeg -i "$1" 2>&1 | grep Video | cut -d, -f 3)
res=$(echo $res | sed 's/ \[.*\]//g')
reswidth=$(echo -n ${res} | cut -dx -f1 | sed -e 's/ //g')
resheight=$(echo -n ${res} | cut -dx -f2)
if [ -z "$resheight" ]; then
echo "Could not determine height - aborting"
exit 1
elif [ -z "$reswidth" ]; then
echo "Could not determine width - aborting"
exit 1
fi
ratio=$(echo "10k${reswidth} ${resheight}/p" | dc)
echo "Width : $reswidth"
echo "Height: $resheight"
echo "Ratio : $ratio"
# Calculate new height and width
newwidth=$maxwidth
newheight=$(echo "0k$newwidth ${ratio}/p" | dc)
# If not multiple of 2, decrement 1
modulo=$(echo "$newheight 2 %p" | dc)
if [ $modulo -eq 1 ]; then
newheight=$(echo "$newheight 1 -p" | dc)
fi
echo "New Width : $newwidth"
echo "New Height: $newheight"
ffmpeg -i "$1" \
-acodec libfaac \
-ab 48k \
-ac 1 \
-ar 44100 \
-vcodec libxvid -vtag xvid \
-b 175kb \
-croptop 4 -cropbottom 4 \
-cropleft 4 -cropright 4 \
-qmin 3 -qmax 8 \
-r 18 \
-s "${newwidth}x${newheight}" \
-aspect $ratio \
"$newname"
Jetzt nicht vergessen, das Skript ausführbar zu machen: chmod +x ~/bin/vid2mobile .Nun navigiert man in den Ordner seiner Wahl und führt einfach den Befehl vid2mobile video.avi eingeben, und er wirft einem die Datei video_mobile.mp4 aus. Dabei muss man sich keine Gedanken mehr über die Einstellungen machen. Es werden unzählige Eingabeformate unterstützt, darunter auch .flv-Dateien von Youtube. Empfohlen sind aber .mp4 -Dateien, die es dort i.d.R. auch gibt.
Das Script erklärt
Im Script verwendete Parameter
Die Optionen und Parameter im Einzelnen erklärt:- acodec libfaac Advanced Audio Codec - mp3-Nachfolger. Besser bei niedrigen Bitraten
- ab 48k Audio-Bitrate soll im Schnitt bei 48 kilobit/s (= 48.000 bit/s) liegen
- ac 1 Ein Audiochannel - also Mono. Wer Stereo haben möchte setzt hier 2 ein. Am besten lässt man dann aber die Zeile weg, damit man Mono-Eingangsdateien nicht unnütz auf Stereo aufbläht.
- ar 44100 Samplerate von 44.1 kHz
- vcodec libxvid und vtag xvid Videocodec soll XviD sein. Andere verfügbare Formate kann man sich mit ffmpeg -formats anzeigen lassen.
- b 175k Video-Bitrate soll bei etwa 175 kilobit/s (=175.000 bit/s = 21,4 kiloByte/s [kiB/s] ) liegen - wer kleine Dateien möchte, kann hier etwas drehen - aber lieber erst am Quantizer drehen (qmin, qmax)
- crop[...] 4 Der Rand wird vor dem vergrößern/-kleinern um 4px beschnitten. Oftmals werden dadurch unschöne Ränder abgeschnitten.
- qmin 3 und qmax 8 Quantizer: Maximale Kompressionsstärke. 1 wäre die beste Qualität, 31 die schlechteste. Schlechter als 8 muss es auch auf dem Handy nicht sein. Wer kleinere Dateien möchte, setzt hier höhere Werte ein, beginnend bei qmax. Bringt auch das nichts, kann man qmin schrittweise hochsetzen.
- r 18 Das Video wird auf 18 Bilder pro Sekunde (fps) reduziert. Das genügt auf dem Handy völlig und spart noch etwas Platz.
- s $width x $heigth Die Ausgabegröße
- apect $ratio Das Seitenverhältnis der Ausgabe. XviD benötigt diesen Parameter dringen, und kann ihn nicht selbst bestimmen. Angaben wie "16:9" oder "4:3" werden auch akzeptiert.
Weitere Möglichkeiten
Wer sein Video noch weiter komprimieren möchte, ohne nennenswert Qualität zu verlieren, kann versuchen sog. B-Frames einzufügen. Dabei werden nicht nurdie Unterschiede zu den vorigen Bildern, sondern auch zu den folgenden gespeichert. Eventuell kann es aber etwas mehr Blöcke geben, auf meinem Handy gab es zusätzlich noch einen Synchronisationsverlust. iPod und PSP spielen solche Videos gar nicht. Aber immerhin schrumpfte ein 50 MiB-Musikvideo nicht auf 8,8 MiB, sondern auf 8,0 MiB. Das sind immerhin fast 10%! Alles, was man dafür tun muss, ist den Parameter -bf 3 anzuhängen.
Weitere Möglichkeiten ergeben sich durch 2pass-Encodung, was ich hier jedoch für übertrieben halte. Wer es dennoch machen möchte, führt ffmpeg zweimal aus. Einmal mit -pass 1 und noch einmal mit -pass 2. Dabei kann beim ersten Durchgang der Audiocodec durch -an ignoriert werden, als Ausgabe wählt man einfach /dev/null - es kommt ja noch kein Video heraus!
So, jetzt habt ihr sicherlich auch ein schönes Spielzeug - mir macht es nun richtig Spaß Videos für mein Handy umzuwandeln. Mit den ganzen GUIs vorher hab ich es irgendwie nicht hinbekommen. Wer Anregungen und Kritik hat, darf sie hier gerne als Kommentar hinterlassen :-)