FFmpeg x264/mp4 Video Encoding auf Debian Lenny

2010-04-02 - kostaki 15 Kommentare »

morguefile by pschubert

FFmpeg ist ein sehr vielseitiges Video und Audio Encoding Tool, das sehr viele Formate unterstützt. Man kann so gut wie alles in das gewünschte Format umwandeln, es läuft auf einer viel zahl von Systemen und ist dazu noch kostenlos (LGPL oder GPL). Es ist auch das Tool wenn es um die Erstellung von h264/mp4 Videos geht wie im Lighttpd MP4/h264 Video Streaming mit mod_h264_streaming Artikel angesprochen. Zum Einsatz kommt hierbei die freie x264 Bibliothek. In diesem Howto wird erklärt wie man FFmpeg mit x264 Support auf einem aktuellen Debian Lenny installiert um unter anderem Streamingfähige h264/mp4 Videos zu erstellen. Da FFmpeg und x264 aktiv entwickelt werden, kann es nötig sein sie zu aktualisieren um die möglichst aktuellste Version zu haben. Das ist auch der Grund warum man vielleicht nicht die von Debian mitgelieferten Stable Pakete benutzen kann. Eine Anleitung für die Aktualisierung gibt es am Ende dieses Artikels.

Die selbst kompilierten Programme werden mit Hilfe von Checkinstall über den Paketmanager installiert, so kann man sie (wenn man will) wieder sauber entfernen. Beim kompilieren kann man bis auf den Checkinstall Aufruf alles mit den Rechten eines unprivilegierten Users ausführen. Checkinstall dann als root oder per sudo aufrufen. Die Sourcen werden in einem extra Verzeichnis im Homedir abgelegt.

$ cd ~
$ mkdir videoencode

Eine sehr gute Anleitung für Ubuntu gibt es im Ubuntuforum. Diese ist auch die Basis für dieses Howto. Die Unterschiede zwischen Ubuntu und Debian habe ich hier mit einfließen lassen.

Debian-multimedia.org einrichten

Man muss einen debian-multimedia.org Mirror zur sources.list hinzufügen. Dazu installiert man zuerst das Keyring Paket von debian-multimedia.org von Hand. Dann kann man den neuen Mirror zu seiner sources.list hinzufügen.

$ cd ~/videoencode
$ wget http://www.debian-multimedia.org/pool/main/d/debian-multimedia-keyring/debian-multimedia-keyring_2008.10.16_all.deb
$ dpkg -i debian-multimedia-keyring_2008.10.16_all.deb
$ nano /etc/apt/sources.list && aptitude update
deb http://www.debian-multimedia.org lenny main
deb-src http://www.debian-multimedia.org lenny main

Debian Lenny Backports einrichten

Zwei benötigte Pakete gibt es nicht in Lenny (aber in Squeeze und über die Lenny-Backports). Man kann sie sehr einfach über Lenny-Backports installieren. Es handelt sich um diese beiden OpenCORE Pakete.

Man kann sich diese Schritte sparen, dann muss man beim kompilieren von FFmpeg den Support für OpenCORE abschalten (--enable-libopencore-amrnb und --enable-libopencore-amrwb entfernen).

$ nano /etc/apt/sources.list && aptitude update
deb http://www.backports.org/debian lenny-backports main contrib non-free

Damit die Meldungen verschwinden installiert man sich noch die backport.org Keys. (Sicherheitsmeldung ignorieren).

$ aptitude install debian-backports-keyring && aptitude update

Jetzt kann man die benötigten Pakete wie folgt installieren.

$ aptitude -t lenny-backports install libopencore-amrnb-dev libopencore-amrwb-dev

Vorbereitungen

Note: Sollten schon irgend welche ffmpeg oder x264 Pakete installiert sein, dann müssen diese zuvor entfernt werden!

Da man den aktuellen Sourcecode aus den jeweiligen Repositorys ziehen muss, ist auch Git und Subversion dabei. Benutzt man die Tarballs, kann man sie weglassen.

$ aptitude install build-essential subversion git-core checkinstall yasm texi2html \
libfaac-dev libfaad-dev libmp3lame-dev  libsdl1.2-dev libx11-dev libxfixes-dev \
libxvidcore4-dev zlib1g-dev

Installation x264

x264 ist eine Freie Bibliotek zum erstellen von h264/AVC Video Streams. Den Source Code von x264 holt man sich am besten direkt aus dem Git Repository. Will man dies nicht kann man sich hier einen aktuellen Tarball runter laden. Die Configure Optionen bekommt man mit ./configure --help, falls man etwas spezielles aktivieren/deaktivieren möchte.

$ cd ~/videoencode
$ git clone git://git.videolan.org/x264.git
$ cd x264
$ ./configure
$ make
$ checkinstall --pkgname=x264 --pkgversion "2:0.`grep X264_BUILD x264.h -m1 | \
cut -d' ' -f3`.`git rev-list HEAD | wc -l`+git`git rev-list HEAD -n 1 | head -c 7`" \
--backup=no --default

Installation libtheora

Theora ist ein älterer Videocodec, der häufig in Verbindung mit ogg Files verwendet wird. Hat man nicht vor Theora zu verwenden, kann man diesen Punkt überspringen. Man muss es dann beim erstellen von FFmpeg weglassen (--enable-libtheora).

$ aptitude install libogg-dev
$ cd ~/videoencode
$ wget http://downloads.xiph.org/releases/theora/libtheora-1.1.1.tar.gz
$ tar xzvf libtheora-1.1.1.tar.gz
$ cd libtheora-1.1.1
$ ./configure --disable-shared
$ make
$ checkinstall --pkgname=libtheora --pkgversion "1.1.1" --backup=no --default

Installation FFmpeg

Will man ohne svn auskommen, gibt es den aktuellen Snapshot hier. Den configure kann man anpassen wie man möchte (./configure --help).

$ cd ~/videoencode
$ svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
$ cd ffmpeg
$ ./configure --enable-gpl --enable-version3 --enable-nonfree --enable-postproc \
--enable-pthreads --enable-libfaac --enable-libfaad --enable-libmp3lame \
--enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora \
--enable-libx264 --enable-libxvid --enable-x11grab
$ make
$ checkinstall --pkgname=ffmpeg --pkgversion "4:SVN-r`svn info | grep Revision | \
awk '{ print $NF }'`" --backup=no --default

Probleme beim Streamen beseitigen mit qt-faststart

Es kann zu Problemen kommen wenn man MP4s mit x264 Streamen möchte. Man erkennt es wenn erst das ganze Video runter geladen wird, bevor es anfängt zu spielen. Das liegt an einer falschen Reihenfolge des Header/Data Teils im Video. Sollte man dieses Problem haben, kann qt-faststart helfen. qt-faststart wird mit ffmpeg ausgeliefert. Mehr Informationen gibt es hier.

$ cd ~/videoencode/ffmpeg
$ make tools/qt-faststart
$ ./tools/qt-faststart <inputfile> <outputfile>

Wenn man möchte, kann man es noch nach /usr/bin/ kopieren.

$ cp tools/qt-faststart /usr/bin/
$ chmod 755 /usr/bin/qt-faststart
$ qt-faststart <inputfile> <outputfile>

FFmpeg Benutzung

FFmpeg kann ne ganze Menge. Für mich war das Streamen von H264 Videos wichtig, deshalb habe ich mich an den Beispielen von h264.code-shop.com orientiert.

$ cd ~
$ mkdir testencode && cd testencode
$ nano encode.sh && chmod 700 encode.sh
#!/bin/bash
infile="input.avi"
tmpfile="input_tmp.mp4"
outfile="output.mp4"
options="-vcodec libx264 -b 512k -flags +loop+mv4 -cmp 256 \
   -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 \
   -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 \
   -flags2 +bpyramid+wpred+mixed_refs+dct8x8 -coder 1 -me_range 16 \
   -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10 \
   -qmax 51 -qdiff 4"

ffmpeg -y -i $infile -an -pass 1 -threads 2 $options $tmpfile
ffmpeg -y -i $infile -acodec libfaac -ar 44100 -ab 96k \
-pass 2 -threads 2 $options $tmpfile
qt-faststart $tmpfile $outfile

Weitere Beispiele gibt es im Ubuntuforum und genaue Erklärungen im FFmpeg x264 Encoding Guide.

FFmpeg und x264 updaten

Da an beiden Projekten aktiv entwickelt wird, sollte man sie von Zeit zu Zeit aktualisieren. Dazu entfernt man die installierten Versionen, updatet den Sourcecode (oder lädt den aktuellen Tarball runter) und kompiliert sie neu.

Zu erst entfernt man ffmpeg und x264.

$ aptitude remove ffmpeg x264

Hat man den Sourcecode von svn/git noch, dann säubert und updatet man ihn.

$ cd ~/videoencode/x264
$ make distclean
$ git pull
$ cd ~/videoencode/ffmpeg
$ make distclean
$ svn update

Dann wiederholt man die Installation ab den jeweiligen ./configure Zeilen.

Deinstallation

Will man alles wieder los werden entfernt man die folgenden Pakete und löscht die herunter geladenen Tarballs/Sourcecodes.

$ aptitude remove ffmpeg x264 libogg-dev libtheora build-essential subversion  \
libfaac-dev libfaad-dev libmp3lame-dev  libsdl1.2-dev libx11-dev libxfixes-dev \
libxvidcore4-dev zlib1g-dev libopencore-amrnb-dev libopencore-amrwb-dev texi2html \
git-core checkinstall yasm
$ rm -rf ~/videoencode

Benchmark

Beim Videoencoding machen die Multi Core CPUs sich wirklich bemerkbar. Auf meinem eigens dafür abgestellten Celeron 3.2GHz mit nur einem Kern braucht ein 6 Minuten Testclips über 34 Minuten. Auf einem Netcup Bronze Vserver mit 8 Kernen dauerte die Konvertierung 3 Minuten 50 Sekunden. Scheinbar wird hier die CPU Drosslung nur bei Auslastung eingeschaltet. Ein Idle Hetzner EQ4 ist nur unwesentlich schneller als der Netcup Vserver und ein Intel Pentium Dual Core braucht 12 Minuten 17 Sekunden.

Netcup: (8 Kern Vserver)

$ cat /proc/cpuinfo
model name      : Intel(R) Core(TM) i7 CPU         920  @ 2.67GHz
cpu MHz         : 2673.147

# ffmpeg mit -threads 8
$ time ./encode.sh
real    3m50.555s
user    16m11.821s
sys     1m30.470s

# ffmpeg mit -threads 16
real    3m58.275s
user    17m19.637s
sys     1m31.446s

Celeron: (1 Kern)

$ cat /proc/cpuinfo
model name      : Intel(R) Celeron(R) D CPU 3.20GHz
cpu MHz         : 3192.013

# ffmpeg mit -threads 1
$ time ./encode.sh
real    34m35.793s
user    32m1.896s
sys     1m35.982s

Hetzner Eq4: (8 Kerne)

$ cat /proc/cpuinfo
model name      : Intel(R) Core(TM) i7 CPU         920  @ 2.67GHz
cpu MHz         : 2667.000

# ffmpeg mit -threads 8
$ time ./encode.sh
real    3m24.083s
user    11m59.961s
sys     1m32.294s

# ffmpeg mit -threads 16
$ time ./encode.sh
real    3m9.757s
user    13m21.998s
sys     1m33.054s

Intel Pentium Dual Core E2200 2.20GHz (2 Kerne)

$ cat /proc/cpuinfo
model name      : Intel(R) Pentium(R) Dual  CPU  E2200  @ 2.20GHz
cpu MHz         : 2200.081

# ffmpeg mit -threads 2
$ time ./encode.sh
real    14m22.659s
user    18m28.237s
sys     1m26.741s

# ffmpeg mit -threads 4
$ time ./encode.sh
real    12m17.746s
user    19m1.015s
sys     1m30.318s

Related Links

Ähnliche Artikel

  1. 15 Kommentare

  2. Stephan
    schrieb am 16.04.2010 um 12:08 Uhr

    Toller Post! Vielen Dank.
    Die debian-Version von ffmpeg ist mit non-free einfach zu sehr beschnitten zum Gebrauch.

  3. Alex
    schrieb am 20.04.2010 um 18:29 Uhr

    Danke für die Super-Anleitung!

    Ich habe so gemacht und es funktioniert. Jedoch will der nächste apt-get update was nachinstallieren… Was mache ich dagegen?

    The following NEW packages will be installed:
    libamrnb3 libamrwb3 libavcodec51 libavdevice52 libavformat52 libavutil49
    libdc1394-22 libdirac0 libgif4 libgsm1 libid3tag0 libimlib2 libogg0
    liboil0.3 libraw1394-8 libschroedinger-1.0-0 libswscale0 libtheora0
    libvorbis0a libvorbisenc2 libx264-65
    The following packages will be upgraded:
    ffmpeg x264
    2 upgraded, 21 newly installed, 0 to remove and 0 not upgraded.

  4. kostaki
    schrieb am 20.04.2010 um 18:40 Uhr

    Dafür scheint es mehrere Möglichkeiten zu geben. Ich habe leider gerade keinen Rechner mit diesem System zur Hand, aber probiere mal das folgende:

    $ aptitude hold ffmpeg x264
    

    Das sollte das Updaten der Pakete verhindern.

    *edit* Ja es funktioniert.

  5. kostaki
    schrieb am 20.04.2010 um 19:19 Uhr

    Ich habe die checkinstall Aufrufe angepasst. Wenn man die richtige –pkgversion angibt, dann scheint auch aptitude safe-upgrade nicht mehr zu versuchen die Pakte upzudaten.

  6. honk
    schrieb am 30.04.2010 um 13:12 Uhr

    Bei der Installation von FFmpeg muss noch folgendes gemacht werden falls die Datei qt-faststart nicht existiert:

    make tools/qt-faststart

  7. honk
    schrieb am 30.04.2010 um 13:14 Uhr

    ups… steht ja da… sorry habs übersehn! :(

  8. mastersin
    schrieb am 06.05.2010 um 10:47 Uhr

    Ich weiß einfach nicht mehr weiter… es ist bestimmt schon mein 20. Versuch ffmpeg + x264 in Kombination zu installieren. Egal mit welcher Anleitung, egal mit welchen Paketen, egal auf welche Art und Weise, es kommt beim kompilieren von ffmpeg immer folgende Fehlermeldung:

    LD ffmpeg_g
    /root/videoencode/ffmpeg/libavcodec/libavcodec.a(libx264.o): In function `X264_init’:
    /root/videoencode/ffmpeg/libavcodec/libx264.c:295: undefined reference to `x264_encoder_open_94′
    collect2: ld returned 1 exit status
    make: *** [ffmpeg_g] Error 1

    Auch das (manchmal funktionierenden) Entfernen von libx264-dev (sofern installiert) bringt beim erneuten kompilieren keinen Erfolg. Auch ein make clean und anschließendes kompilieren… nichts. Ich weiß nun wirklich nicht mehr weiter. Habe schon aus Hoffnung das System von stable Etch auf stable Lenny geupdatet, ohne Erfolg.

    Vor jeder Installation von ffmpeg + x264 habe ich alles entfernt was mit mit der Installation zusammen hängt. Es waren keine Pakete mehr vorhanden die Ordnerstrukturen wurden jeweils komplett gelöscht.

    Sofern jemand von euch noch einen Hinweis hat oder das selbe Problem hatte – es aber lösen könnte – wäre es verdammt cool wenn dieser sich melden könnten. Vielen Dank. Gerne auch direkt per E-Mail: info@moepsee.de

    Danke.

  9. mastersin
    schrieb am 06.05.2010 um 13:18 Uhr

    Endlich! Nachdem ich das komplette System von jeglichen ffmpeg-/x264-Dateien gesäubert habe und auch alle deb Pakete gelöscht den Cache von apt-get geleert hatte und das Tutorial noch einmal durchgegangen bin hat nun alles funktioniert. \o/

    Vielen Dank!

  10. kostaki
    schrieb am 06.05.2010 um 14:06 Uhr

    Na dann, Gratulation! Hatte jetzt schon überlegt wo der Bug herkommen könnte, aber ich hab das beschriebene System immer auf sauberen, neu installierten Installationen getestet und da wenig Probleme bei gehabt. Freut mich das du es geschafft hat. :)

  11. Uwe Degenhardt
    schrieb am 02.07.2010 um 11:39 Uhr

    Toll Deine Beiträge, weiter so !
    Besonders der Artikel über das Apache Benchmarking und fcgid fand ich super.
    Uwe

  12. Erik
    schrieb am 08.07.2010 um 07:08 Uhr

    Hi,

    hast Du mal den “apt-get source”-Weg probiert? Nur weil man stable einsetzen möchte, muss das nicht heissen, dass man nicht durchaus auch Pakete aus sid installieren könnte, solange man sie auf die in stable enthaltenen Versionen der verwendeten Bibliotheken kompiliert.

    Das hat dann den Vorteil, dass man sich nicht mit Repositories und Tarballs herumschlagen muss und trotzdem eigene Compile- und Configure-Schalter setzen kann, wenn man denn möchte.

    Ich fände schon ganz gut, wenn Du mal den Debian-Weg ausprobieren und aufzeigen würdest. Checkinstall ist doch nur die halbe Lösung zum “paketieren”.

  13. Nikolaus
    schrieb am 31.10.2010 um 23:32 Uhr

    Hi,
    danke für die Anleitung – ein kleiner Hinweis, das Packet libfaad-dev und die config-Option “–enable-libfaad” wird nicht mehr benötigt, siehe auch http://ubuntuforums.org/showpost.php?p=9487962&postcount=1058

  14. Raymond
    schrieb am 18.02.2011 um 16:33 Uhr

    wget http://www.debian-multimedia.org/pool/main/d/debian-multimedia-keyring/debian-multimedia-keyring_2008.10.16_all.deb

    Existiert nicht mehr! Alternativen?

  15. Tom
    schrieb am 09.04.2011 um 03:07 Uhr

    Immer wieder schön zu sehen, wie jeder empfiehlt, einen Mirror für den arg gebeutelten debian-multimedia Server zu verwenden – und im nächsten Absatz den Master in die sources.list einträgt.
    …und wenn dann debian-multimedia.org down ist, stellt sich heraus, dass alle tatsächlich existenten Mirror-Listen auf debian-multimedia liegen. Alle anderen haben nur drauf hingewiesen und selbst im Traum nicht daran gedacht, einen zu benutzen. Einschliesslich meiner Person – sonst würde ich kaum danach suchen. Der Kollege Marillat muss wirklich ein stoisches Gemüt besitzen, sonst hätte er längst alles hingeschmissen…

  16. Florian
    schrieb am 16.12.2011 um 11:46 Uhr

    ich habe ein problem mit ffmpeg, flvtool2 und mp4box. irgendwie werden sie erkannt trotz das ich sie (glaube ich) installiert habe. Mein Projekt http://www.friesenvideo.de aber ein convert ist immer fail. bin leider kein heller in Debain 6.0 linux. wäre cool wenns Hilfe gebe

    Danke ;) (Frohes Fest allen)

Kommentar schreiben

*

*