Ergebnis 1 bis 1 von 1

Thema: schnelle Videokonvertierung mit FFMpeg (+ Transcode)

  1. #1
    User
    Registriert seit
    May 2001
    Beiträge
    8.688

    schnelle Videokonvertierung mit FFMpeg (+ Transcode)

    1. Vorwort

    ffmpeg ist eine Ansammlung von De und Encodern. Diese sind besonders Leistungsstark in Sachen Geschwindigkeit. Noch werden zwar nicht alle Funktionen unterstützt die man braucht (z.B. mpeg2 Encoding und VCD) aber trotzdem kann man damit schon eine ganze Menge machen.

    Eine anschließende Bearbeitung mit Transcode ist dann ja möglich. Und da ffmpeg schon einiges an Vorarbeit geleistet hat (Auflösung, Bitrate etc.) läuft Transcode relativ zügig durch. Die Gesamtzeit kann dann deutlich unter der bleiben die Transcode alleine für alles gebraucht hätte.

    Wichtig ist auch noch zu erwähnen das ffmpeg ein Programm für die Konsole ist. Es bietet zwar weniger Optionen als Transcode aber auch hier ist einiges möglich was einem zu Anfang ziemliche Probleme macht. Hat man aber das Grundprinziep verstanden dann fällt einem das ganze relativ leicht und man kann die Berechnung bequem in einer Shell laufen lassen.


    In dieser HowTo möchte ich die Installation und grundsätzliche Benutzung beschreiben. Dabei werde ich nur auf die Optionen eingehen die man in der Regel benötigt. Habt ihr diese aber verstanden, sollte das raussuchen weiterer Optionen aus der Hilfe kein Problem mehr darstellen.


    2. Installation

    Zunächst solltet ihr auf jeden Fall folgende Software installiert haben:

    mjpegtools -> http://freshmeat.net/projects/mjpeg/
    liba52 -> http://freshmeat.net/projects/liba52/
    Lame -> http://freshmeat.net/projects/lame/

    ffmpeg ist ständig im Aufbau, da es noch als Alpha gekennzeichnt ist. Daher muss man sich einen CVS Snapshot von der Homepage runter laden:

    http://ffmpeg.sourceforge.net/

    - Ladet euch ffmpeg-cvs.tar.gz runter und speichert es auf eurer Platte

    - entpacken: tar vxfz ffmpeg-cvs.tar.gz

    - In das Verzeichnis wechseln: cd ffmpeg*

    - Konfigurieren: ./configure

    Jetzt solltet ihr euch mal anschauen was er da gefunden hat und compilieren will und was alles nicht. Dies habt ihr entweder schon installiert, oder ihr sucht es euch über Freshmeat oder Sourceforge und installiert es nach.

    - ./configure --help

    Schaut euch an mit welchen Befehlen ihr die anderen Optionen aktivieren könnt. Bei mir sah das so aus:

    - ./configure --enable-a52bin --enable-mp3lame

    Damit sind der a52 Decoder und Lame aktiviert und man kann sie in ffmpeg verwenden.

    - Auch MJpegtools sollten installiert sein, da auch dieses Projekt einige gute De und Encoder liefert

    - Dann: make

    - Zum installieren: make install
    - Oder: checkinstall (sofern installiert)

    So, nun sollte ffmpeg korrekt installiert sein.


    3. Verwendung von ffmpeg

    Wie schon angedeutet beherrscht ffmpeg viele aber nicht alle Formate. Darüber Hinaus manche nur als De oder Encoder. Daher solltet ihr euch eine Übersicht anschauen was ihr jetzt decodieren und zu was encodieren könnt:

    ffmpeg -formats

    Diese Übersicht zeigt euch welche Formate und welche Codecs für Input und Output möglich sind. Dabei tauchen einige bei beiden auf und einige nur bei einem von beiden.

    Eine etwas übersichtlichere Tabelle gibts hier: http://ffmpeg.sourceforge.net/ffmpeg-doc.html#SEC13

    ABER: Diese Tabelle umfasst nur ffmpeg. Wenn ihr Lame installiert und ffmpeg entsprechend compiliert habt, dann könnt ihr auch mp3 encoden, obwohl es nicht in der Tabelle steht.


    Der Grundsyntax sieht folgendermaßen aus:

    ffmpeg "Eingangsoptionen" -i inputfile "Ausgangsoptionen" outputfile

    "-i inputfile" ist ganz einfach Name und Pfad für den File den ihr verarbeiten wollt (z.B. xyz.mpg oder /data/xyz.mpg)
    "outputfile" ist der Name und das Containerformat für den Zielfile (z.B. xyz.avi oder /data/xyz.avi)

    Beispiel für ein Avi zu Mpeg:

    ffmpeg "Eingangsoptionen" -i xyz.avi "Ausgangsoptionen" abc.mpg

    Somit muss man sich jetzt nur noch mit den Optionen für Input und Output beschäftigen. Von denen ich hier aber nur die wichtigsten ansprechen werde. Wer verstanden hat wie es funktioniert, der kann den Rest über "ffmpeg -h" finden und einfach in die Kommandozeile einfügen.


    Die wichtigsten Optionen für De und Encoder:

    -b -> Video Bitrate (in kbit/s) -> z.B. 200

    -r -> Bilder pro Sekunde -> 25 für PAL (nur wichtig falls Inputfile NTSC = 30 ist)

    -sameq -> versucht die Qualität des Eingangsfiles zu erhalten (in der Regel empfohlen)

    -pass n -> n = 1 oder n = 2 für 1 Pass Encoding oder 2 Pass Encoding (kann entscheidend für die Qualität sein)


    -ab -> Audio bitrate (in kbit/s) -> z.B. 192 für SVCD oder 224 für VCD

    -ar -> Audio Samplerate -> in der Regel sollte das 44100 sein


    -vcodec -> Der Videocodec des Ausgangsfiles (z.B. mjpeg oder mpeg1video (VCD))

    -acodec -> Der Audiocodec des Ausgangsfiles (z.B. mp2 oder mp3)


    -s -> Auflösung des Ausgangsfiles -> z.B. 480x576 (SVCD) oder 352x288 (VCD)


    Damit habt ihr jetzt die wichtigsten Optionen zusammen um einen Videofile zu einem anderen zu codieren und dabei verschiedene Parameter zu ändern.


    Beispiel:

    Input: abc.mpg, Mpeg, 30 Bilder/Sek. (NTSC), 128 kBit/s, 48.000 kHz, 400x300
    gewünschter Output: abc.avi, mjpeg, 25 Bilder/Sek. (PAL), 224 kBit/s, 44.000 kHz, 352x288

    Kommando:

    ffmpeg -i abc.mpg -r 25 -ab 224 -ar 44100 -vcodec mjpeg -acodec mp2 -s 352x288 -sameq abc.avi

    Nun sollte er mit hoher Geschwindigkeit anfangen zu rechnen. Abhängig von der Länge des Eingangsfiles nimmt dies einige Minuten in Anspruch. ABER: ein 90 Minuten Film würde bei Transcode weit über eine Stunde brauchen. ffmpeg schafft es in deutlich weniger als einer. Dafür kann es aber auch deutlich weniger als Transcode (z.B. keine schwarzen Ränder).


    4. Nachgeschaltetes Transcode:

    Wie schon erwähnt ist ffmpeg schneller als Transcode aber auch längst nicht so vielseitig wie letzteres. Daher kann man jetzt hergehen und eine zwei Stufen Bearbeitung durchführen. Also erst ffmpeg rechnen lassen so gut es geht und anschließend dann Transcode noch mal rechnen lassen.

    Kleines Rechenbeispiel das ich aus einigen meiner Videokonvertierungsaktionen habe:

    - video sei 45 Minuten lang

    -> ffmpeg rechnet Auflösung, Framerate u.ä. in ca. 10 Minuten um
    -> Transcode rechnet dann den File in eine Blockgröße für VCD um (was ffmpeg nicht kann), in ca. 43 Minuten
    --> Gesamtzeit bis zum fertigen VCD kompatiblen Mpeg: 53 Minuten

    -> jetzt lassen wir Transcode alles alleine rechnen
    -> Geschwindigkeit ca. 15 Frames pro Sekunde (macht für einen 45 Minuten Film: ((45 * 60 * 25) /15) /60= 75 Minuten)
    -> Multiplexen noch mal 3 Minuten
    --> Gesamtzeit: 78 Minuten

    Der Unterschied liegt also bei gut 25 Minuten und das bei einem File wo auch Transcode noch alleine ganz gut klar kommen würde. Kommt ihr erst mal zu Files mit 100 Minuten und drastischeren Änderungen so würde die Differenz noch erheblich größer werden.

    Fazit: Es kann sich durchaus lohnen ffmpeg zu verwenden. Vor allem weil es schnell ist. So schnell das sogar eine Nachbearbeitung mit Transcode noch einiges an Zeit einspart. Es ist schließlich ein Unterschied ob ihr eine oder zwei Stunden braucht. Zumindest wenn ihr nicht absolute Höchstqualität und sehr viele Parameter zum drehen braucht.


    Zur Installation und benutzung von Transcode sage ich hier gar nichts. Ich verweise da auf meine erste HowTo: http://www.linuxforen.de/forums/show...threadid=50974


    Beispiel:

    Oben genanntes Beispiel soll jetzt zu einer VCD werden. Da ffmpeg die Blockgröße nicht anpasst ist es notwendig dies im gerade beschriebenen zwei Schrittverfahren zu tun. Da ich den Mpeg Encoder von ffmpeg nicht besonders gut finde gehe ich über mjpeg als Zwischenformat. Dieses Format sollte in der Regel keine Verluste haben. Der File kann durchaus von 450 MB Mpeg auf 1.2 GB Avi (mjpeg) kommen. Das Mpeg nach Transcode ist dann aber wieder zwischen 400 und 500 MB groß. Somit sollte diese Aktion keine nennenswerten Verluste haben.


    Input: abc.mpg, Mpeg, 30 Bilder/Sek. (NTFS), 128 kBit/s, 48.000 kHz, 400x300
    gewünschter Output: VCD (abc.mpg, Mpeg1, 25 Bilder/Sek. (PAL), 224 kBit/s, 44.000 kHz, 352x288)

    Kommando:

    ffmpeg -i abc.mpg -r 25 -ab 224 -ar 44100 -vcodec mjpeg -acodec mp2 -s 352x288 -sameq abc.avi

    transcode -i abc.avi -x af6,af6 -V -o abc -y mpeg2enc,mp2enc -F 1,"-S 770 -B 260 -V 230"

    mplex -f 1 -o abc_%d.mpg abc.m1v abc.mpa

    vcdimager abc_1.mpg

    daoburn videocd.cue

    (wegen der Befehle ab transcode, siehe andere HowTo !!!)


    Erweiterung des Beispiels:

    Genauso kann man nun auch das Problem lösen das ffmpeg keine Ränder kann:

    ffmpeg -i abc.mpg -r 25 -ab 224 -ar 44100 -vcodec mjpeg -acodec mp2 -s 322x288 -sameq abc.avi

    Also fehlende Höhe: 352 - 322 => 30 = 2 * 15

    Also: transcode -i abc.avi -x af6,af6 -V -o abc -y mpeg2enc,mp2enc -j -15,0,-15,0 -F 1,"-S 770 -B 260 -V 230"

    usw.
    Geändert von hunter (20.11.02 um 17:45 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •