FFmpeg x264/mp4 Video Encoding auf Debian Lenny

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
- weitere Anleitung zur Installation von ffmpeg und x264 auf Debian Lenny (englisch)
- HOWTO: Install and use the latest FFmpeg and x264 (englisch)
15 Kommentare
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.
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.
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:
Das sollte das Updaten der Pakete verhindern.
*edit* Ja es funktioniert.
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.
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
honk
schrieb am 30.04.2010 um 13:14 Uhr
ups… steht ja da… sorry habs übersehn!
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.
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!
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.
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
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”.
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
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?
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…
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)