english >> deutsch Home | UdS | MPI | SB

Wie encodet man H.264/MPEG-4 AVC (x264) mit mencoder/ffmpeg



H.264/MPEG-4 AVC ist ein hocheffizienter Standard zur Videokompression. Er wurde zunächst von der ITU (Study Group 16, Video Coding Experts Group) unter dem Namen H.26L entwickelt. Im Jahre 2001 schloss sich die ITU-Gruppe mit MPEG-Visual zusammen und führte die Entwicklung gemeinschaftlich im Joint Video Team (JVT) fort. Ziel des Projektes war es, ein Kompressionsverfahren zu entwerfen, das im Vergleich zu bisherigen Standards sowohl für mobile Anwendungen als auch im TV- und HD-Bereich die benötigte Datenrate bei gleicher Qualität mindestens um die Hälfte reduziert. Im Jahr 2003 wurde der Standard in beiden Organisationen im identischen Wortlaut verabschiedet. Die ITU-Bezeichnung lautet dabei H.264. Bei ISO/IEC MPEG läuft der Standard unter der Bezeichnung MPEG-4/AVC (Advanced Video Coding) und ist der zehnte Teil des MPEG-4-Standards (MPEG-4/Part 10, ISO/IEC 14496-10).

0. Hinweis

Dieses kleines Tutorial richtet sich an User, die unerfahren genug sind, um ein Video selbst zu encoden und gleichzeitig aber erfahren genug sind, um zu verstehen, wie die unteren Anweisungen zu benutzen sind. Dies ist ein Tutorial für Linux benutzer. Wie man soetwas unter Windows anstellt, wird hier nicht erwähnt. Viel Spass und Geduld beim Encoden :-)


1. Einleitung

H.264 ist ein neuer Codec, dessen Qualität bei der gleichen Bitrate die DivX/XVid und ähnliche Codecs übertrifft. Deshalb wollte ich unbedingt herausfinden, wie man nun ein Video bzw. Bildsequenz (image sequence) mit diesem Codec encoden kann. Da ich ein Freund von OpenSource Systemen bin, war für mich natürlich wichtig herauszufinden, wie man das ganze auch unter Linux machen kann. Dabei wollte ich das altbewährte ffmpeg oder mencoder benutzen. Hier werde ich nicht darauf eingehen, wie man diese Tools mit x264-codec compiliert. Stattdessen werde ich nur die benötigten Schritte zeigen, um schnell an ein lauffähiges Video zu kommen.


2. Tools

  • ffmpeg : Der Link auf die Homepage
  • mencoder : guter En/Decoding-Tool das zusammen mit MPlayer entwickelt wird. Link
  • MP4BOX : wird für Muxing/Demuxing und erzeugung von mpeg4 streams benutzt. Das Tool gehört zur gpac Package und kann hier heruntergeladen werden. Herunterladen, entpacken, compilieren und installieren. Dannach sollte MP4Box vorhanden sein
  • mkvmerge (optional) : Falls man ein Matroska-Video-File .mkv erzeugen will, statt .mp4 Matroska ist ähnlich zu .avi, hat aber viel mehr Vorteile und hoffentlich bald auch bessere Verbreitung. Homepgage

3. Imagesequenz / Encoden

Da ich selbst öfters mal Video-Sequenzen aus meinen Programmen/Demos herausrendere, suchte ich nach einem Weg diese mit dem H.264 codec zu encoden. Folgende Vorgehensweise hat sich dann als die Lösung bei mir etabliert:

0. Folgendes Variablen sollten in den vorgestellten Anweisungen durch gewünschte Werten ersetzt werden:
SCALE=1920:1088
ASPECT=16:9
BITRATE=16000
FPS=30
PATH=relative/path/to/the/image/sequence
EXT=png
AUDIO=realtive/path/to/the/soundtrack.wav
AUDIO_BITRATE=192k

1. Ein Video im rohen (raw) .264 Format erzeugen mittels:
mencoder -aspect $ASPECT -vf scale=$SCALE,harddup -ovc x264 -x264encopts \
bitrate=$BITRATE:threads=auto:frameref=5:bframes=3:nob_pyramid:\
direct_pred=auto:partitions=all:8x8dct:subq=6:mixed_refs:nodct_decimate \
-nosound -ofps $FPS -noskip -of rawvideo -o output.264 mf://$PATH/*.$EXT -mf fps=$FPS

Für einen 2.Pass encoding Vorgang benutzt man folgende Anweisungen:
mencoder -aspect $ASPECT -vf scale=$SCALE,harddup -ovc x264 -x264encopts \
bitrate=$BITRATE:threads=auto:pass=1:turbo=2:frameref=1:bframes=3:nob_pyramid:\
direct_pred=auto:partitions=all:8x8dct:subq=1:mixed_refs:nodct_decimate \
-nosound -ofps $FPS -noskip -of rawvideo -o /dev/null mf://$PATH/*.$EXT -mf fps=$FPS


mencoder -aspect $ASPECT -vf scale=$SCALE,harddup -ovc x264 -x264encopts \
bitrate=$BITRATE:threads=auto:pass=2:frameref=5:bframes=3:nob_pyramid:\
direct_pred=auto:partitions=all:8x8dct:subq=6:mixed_refs:nodct_decimate \
-nosound -ofps $FPS -noskip -of rawvideo -o output.264 mf://$PATH/*.$EXT -mf fps=$FPS

Als Ergebnis liegt im Verzeichnis, von wo dieses Skript aufgerufen wurde eine output.264 Datei. Dieses kann bereits mit z.B. mit MPlayer abgespielt werden, da es einen raw-mp4 stream enthält.



2. Nun encoden wir den passenden Soundtrack mittels ffmpeg nach .aac. Man kann selbstverständlich auch mencoder nutzen, oder andere Tools, die einem lieber sind. Man kann natürlich auch nach .mp3 encoden (einfach nur die Dateiendung auf .mp3 und "-acodec aac" ins "-acodec mp3" ändern)
ffmpeg -y -i $AUDIO -acodec libaac -ab $AUDIO_BITRATE sound.aac
Als Ergebnis liegt im gleichen Verzeichnis eine sound.aac Datei, die später ins Video hineingemuxt werden muss.


3. Nun benutzen wir MP4Box, um eine .mp4 Datei zu erzeugen
MP4Box -fps $FPS -add output.264 -add sound.aac output.mp4

Als Ergebnis bekommt man nun eine output.mp4 Datei, die einen korrekten .mp4 Stream enthält. Möchte man stattdessen eine .mkv Videodatei erzeugen, so ruft man folgende Befehle auf:
MP4Box -fps $FPS -add output.264 mp4stream.mp4
mkvmerge -o output.mkv mp4stream.mp4 --aac-is-sbr 0 audio.aac
rm -f mp4stream.mp4
Nun hat man eine output.mkv Datei liegen, die einen MP4 und einen AAC Strom enthält. Dieses kann mittels MPlayer abgespielt werden.


4. Kompatibilität

Linux:

Die somit erzeugten Videos könne ohne weitere problemen mit Hilfe von MPlayer und VLC (Linux) abgespielt werden. Ob Windows-Versionen von diesen Playern es auch tun, ist mir leider noch nicht bekannt. Zum jetzigen Zeitpunkt hat Xine, noch Schwerigkleiten mit H.264 Streams.

Windows:

Windows Media Player 11, kann nur .mp4 Dateien, nicht aber .mkv Dateien abspielen. Auf der Homepage von Matroska -Codec gibt es eine Anleitung, wie man Media Player auch dazu bewegen kann.
Quicktime kann nur ab Version 7.0 mit H.264 Stream umgehen. Dennoch habe ich es nicht geschafft, dass Quicktime die von mir erzeugten Videos ordentlich abspielt. Es gibt zahlreiche Websites, die Einschränkungen von Quicktime beschreiben (bframes=2, nodct8x8, und und und), dennoch schaffte Quciktime es nicht auch mit solchen Parametern die Videos abzuspielen.







Art Tevs,    26. March 2007 13:45:30.
Der Artikel wurde 42118 mal aufgerufen.