7.3. Encodieren mit der libavcodec Codecfamilie

libavcodec stellt einfache Encodierung für eine Menge interessanter Video- und Audioformate zur Verfügung. Du kannst folgende Codecs encodieren (mehr oder weniger aktuell):

7.3.1. Videocodecs von libavcodec

Name des VideocodecsBeschreibung
mjpeg Motion-JPEG
ljpeg Verlustfreies JPEG
jpegls JPEG LS
targa Targa-Bild
gif GIF-Bild
png PNG-Bild
bmp BMP-Bild
h261 H.261
h263 H.263
h263p H.263+
mpeg4 ISO Standard MPEG-4 (DivX, Xvid-kompatibel)
msmpeg4 Pre-Standard MPEG-4 Variante von MS, v3 (AKA DivX3)
msmpeg4v1 Pre-Standard MPEG-4 von MS, v1
msmpeg4v2 Pre-Standard MPEG-4 von MS, v2 (in alten ASF-Dateien verwendet)
wmv1 Windows Media Video, Version 1 (AKA WMV7)
wmv2 Windows Media Video, Version 2 (AKA WMV8)
rv10 RealVideo 1.0
rv20 RealVideo 2.0
mpeg1video MPEG-1 Video
mpeg2video MPEG-2 Video
huffyuv Verlustfreie (lossless) Kompression
ffvhuff FFmpeg-modifizierter huffyuv, verlustfrei
asv1 ASUS Video v1
asv2 ASUS Video v2
vcr1 ATI VCR1 codec
ffv1 FFmpeg's verlustfreier (lossless) Videocodec
svq1 Sorenson Video 1
flv Sorenson H.263, der in Flash Video benutzt wird
flashsv Flash Screen Video
dvvideo Sony Digital Video
snow FFmpeg's experimenteller Wavelet-basierter Codec
zbmv Zip Blocks Motion Video
cljr Cirrus Logic AccuPak Codec

Die erste Spalte enthält die Codecnamen, die nach der Konfiguration vcodec übergeben werden müssen, wie: -lavcopts vcodec=msmpeg4

Ein Beispiel mit MJPEG-Komprimierung:

mencoder dvd://2 -o title2.avi -ovc lavc -lavcopts vcodec=mjpeg -oac copy

7.3.2. Audiocodecs von libavcodec

Name des AudiocodecsBeschreibung
ac3Dolby Digital (AC-3)
adpcm_*Adaptive PCM-Formate - siehe begleitende Tabelle
flacFree Lossless Audio Codec (FLAC)
g726G.726 ADPCM
libamr_nb3GPP Adaptive Multi-Rate (AMR) narrow-band
libamr_wb3GPP Adaptive Multi-Rate (AMR) wide-band
libfaacAdvanced Audio Coding (AAC) - verwendet FAAC
libgsmETSI GSM 06.10 full rate
libgsm_msMicrosoft GSM
libmp3lameMPEG-1 audio layer 3 (MP3) - verwendet LAME
mp2MPEG-1 Audio Layer 2
pcm_*PCM-Formate - siehe begleitende Tabelle
roq_dpcmId Software RoQ DPCM
sonicexperimenteller verlustbehafteter FFmpeg-Codec
soniclsexperimenteller verlustfreier FFmpeg-Codec
vorbisVorbis
wma1Windows Media Audio v1
wma2Windows Media Audio v2

Die erste Spalte enthält die Codecnamen, die nach der Konfiguration acodec übergeben werden müssen, wie: -lavcopts acodec=ac3

Ein Beispiel mit AC3-Kompression:

mencoder dvd://2 -o title2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy

Im Gegensatz zu den Videocodecs von libavcodec machen dessen Audiocodecs keinen weisen Gebrauch von den Bits, die ihnen übergeben werden, da es ihnen an einem minimalen psychoakustischen Modell fehlt (falls überhaupt eins vorhanden ist), wodurch sich die meisten anderen Codec-Implementierungen auszeichnen. Beachte jedoch, dass all diese Audiocodecs sehr schnell sind und überall dort hervorragend arbeiten, wo MEncoder mit libavcodec kompiliert wurde (was meistens der Fall ist) und nicht von externen Programmbibliotheken abhängt.

7.3.2.1. PCM/ADPCM-Format, begleitende Tabelle

PCM/ADPCM CodecnameBeschreibung
pcm_s32lesigned 32-bit little-endian
pcm_s32besigned 32-bit big-endian
pcm_u32leunsigned 32-bit little-endian
pcm_u32beunsigned 32-bit big-endian
pcm_s24lesigned 24-bit little-endian
pcm_s24besigned 24-bit big-endian
pcm_u24leunsigned 24-bit little-endian
pcm_u24beunsigned 24-bit big-endian
pcm_s16lesigned 16-bit little-endian
pcm_s16besigned 16-bit big-endian
pcm_u16leunsigned 16-bit little-endian
pcm_u16beunsigned 16-bit big-endian
pcm_s8signed 8-bit
pcm_u8unsigned 8-bit
pcm_alawG.711 A-LAW
pcm_mulawG.711 μ-LAW
pcm_s24daudsigned 24-bit D-Cinema Audioformat
pcm_zorkActivision Zork Nemesis
adpcm_ima_qtApple QuickTime
adpcm_ima_wavMicrosoft/IBM WAVE
adpcm_ima_dk3Duck DK3
adpcm_ima_dk4Duck DK4
adpcm_ima_wsWestwood Studios
adpcm_ima_smjpegSDL Motion JPEG
adpcm_msMicrosoft
adpcm_4xm4X Technologies
adpcm_xaPhillips Yellow Book CD-ROM eXtended Architecture
adpcm_eaElectronic Arts
adpcm_ctCreative 16->4-bit
adpcm_swfAdobe Shockwave Flash
adpcm_yamahaYamaha
adpcm_sbpro_4Creative VOC SoundBlaster Pro 8->4-bit
adpcm_sbpro_3Creative VOC SoundBlaster Pro 8->2.6-bit
adpcm_sbpro_2Creative VOC SoundBlaster Pro 8->2-bit
adpcm_thpNintendo GameCube FMV THP
adpcm_adxSega/CRI ADX

7.3.3. Encodieroptionen von libavcodec

Idealerweise möchtest du eventuell in der Lage sein, dem Encoder einfach zu sagen, er soll in den "hochqualitativen" Modus wechseln und weiter machen. Das wäre vermutlich nett, aber unglücklicherweise schwer zu implementieren, da verschiedene Encodieroptionen unterschiedliche Qualitätsresultate hervorbringen, abhängig vom Quellmaterial. Das liegt daran, dass die Komprimierung von den visuellen Eigenschaften des fraglichen Videos abhängt. Zum Beispiel haben Anime und Live-Action sehr unterschiedliche Eigenschaften und benötigen aus diesm Grund verschiedene Optionen, um optimale Encodierung zu erreichen. Die gute Neuigkeit ist, dass einige Optionen wie mbd=2, trell und v4mv nie ausgelassen werden sollten. Siehe unten nach der detaillierten Beschreibung allgemeiner Encodieroptionen.

Anzupassende Optionen:

  • vmax_b_frames: 1 oder 2 ist gut, abhängig vom Film. Beachte, dass du, falls deine Encodierung von DivX5 decodierbar sein muss, den Support für "closed GOP" aktivieren musst, indem du die libavcodec-Option cgop verwendest, du musst jedoch Szenenerkennung deaktivieren, was wiederum keine gute Idee ist, da es die Ecodierungseffizienz etwas angreift.

  • vb_strategy=1: hilft in Szenen mit viel Bewegung (high-motion). Bei manchen Videos wird vmax_b_frames der Qualität schaden, vmax_b_frames=2 zusammen mit vb_strategy=1 hilft jedoch.

  • dia: Bewegungssuchbereich. Größer ist besser als kleiner. Negative Werte sind ein komplett anderer Maßstab. Gute Werte sind -1 für ein schnelle oder 2-4 für langsame Encodierung.

  • predia: Bewegungssuche Vorabdurchlauf (pre-pass). Nicht so wichtig wie dia. Gute Werte sind 1 (Standard) bis 4. Erfordert preme=2, um wirklich was zu nützen.

  • cmp, subcmp, precmp: Vergleichsfunktion zur Bewegungseinschätzung. Experimentiere mit Werten von 0 (Standard), 2 (hadamard), 3 (dct) und 6 (Ratenverzerrung). 0 ist am schnellsten und ausreichend für precmp. Für cmp und subcmp ist 2 gut bei Anime, und 3 ist gut bei Live-Action. 6 kann leicht besser sein oder auch nicht, ist aber langsam.

  • last_pred: Anzahl der Bewegungsvorhersagen, die vom vorherigen Frame genommen werden sollen. 1-3 oder so hilft bei geringer Geschwindigkeitseinbuße. Höhere Werte sind langsam bei keinerlei Zusatzgewinn.

  • cbp, mv0: Kontrolliert die Auswahl von Macroblöcken. Kleine Geschwindigkeitseinbußen bei kleinem Qualitätsgewinn.

  • qprd: adaptive Quantisierung basierend auf der Komplexität des Macroblocks. Kann hilfreich sein oder schaden, abhängig vom Video und anderen Optionen. Dies kann Artefakte verursachen, es sei denn, du setzt vqmax auf einen halbwegs kleinen Wert (6 ist gut, vielleicht so langsam wie 4); vqmin=1 sollte ebenfalls helfen.

  • qns: sehr langsam, speziell wenn kombiniert mit qprd. Diese Option veranlasst den Encoder, durch Kompressionsartefakte entstandenes Rauschen zu minimieren anstatt das encodierte Video strikt der Quelle anzupassen. Verwende dies nicht, es sei denn du, hast bereits alles andere so weit wie möglich optimiert und die Resultate sind immer noch nicht gut genug.

  • vqcomp: Frequenzkontrolle optimieren. Welche Werte gut sind, hängt vom Film ab. Du kannst dies sicher so lassen wie es ist, wenn du willst. Wird vqcomp verringert, werden mehr Bits auf Szenen mit geringer Komlexität gelegt, wird es erhöht, legt es diese Bits auf Szenen mit hoher Komlexität (Standard: 0.5, Bereich: 0-1. empfohlener Bereich: 0.5-0.7).

  • vlelim, vcelim: Setzt die Schwelle für die Eliminierung einzelner Koeffizienten bei Helligkeits- und Farbanteilen. Sie werden in allen MPEG-ähnlichen Algorithmen getrennt encodiert. Die Idee hinter diesen Optionen ist, einige gute Heuristiken zu verwenden, um zu bestimmen, wenn ein Wechsel innerhalb eines Blocks kleiner als der der von dir festgelegte Schwellenwert ist und in solch einem Fall den Block einfach so zu encodieren als fände "kein Wechsel" statt. Das spart Bits und beschleunigt womöglich die Encodierunng. vlelim=-4 und vcelim=9 scheinen gut für Live-Filme zu sein, helfen aber scheinbar nicht bei Anime; beim Encodieren einer Animation solltest du sie womöglich unverändert lassen.

  • qpel: Bewegungsabschätzung auf ein viertel Pixel (quarter pel). MPEG-4 verwendet als Voreinstellung eine Halbpixel-Genauigkeit für die Bewegungssuche, deswegen hat diese Option einen Overhead, da mehr Informationen in der encodierte Datei untergebracht werden. Der Kompressionsgewinn/-verlust hängt vom Film ab, ist aber in der Regel nicht sonderlich effektiv bei Anime. qpel zieht immer eine signifikante Erhöhung der CPU-Decodierzeit nach sich (+25% in der Praxis).

  • psnr: wirkt sich eigentlich nicht auf das Encodieren aus, schreibt jedoch eine Log-Datei mit Typ/Größe/Qualität jedes Frames und gibt am Ende die Summe des PSNR Signal-zu-Rauschabstands (Peak Signal to Noise Ratio) aus.

Optionen, mit denen besser nicht herumgespielt werden sollte:

  • vme: Der Standardwert ist der beste.

  • lumi_mask, dark_mask: Psychovisuell adaptive Quantisierung. Du solltest nicht im Traum daran denken, mit diesen Optionen herumzuspielen, wenn dir Qualität wichtig ist. Vernünftige Werte mögen in deinem Fall effektiv sein, aber sei gewarnt, dies ist sehr subjektiv.

  • scplx_mask: Versucht, Blockartefakte zu verhindern, Postprocessing ist aber besser.

7.3.4. Beispiele für Encodierungseinstellungen

Die folgenden Einstellungen sind Beispiele verschiedener Kombinationen von Encodierungsoptionen, die den Kompromiss Geschwindigkeit gegenüber Qualität bei gleicher Zielbitrate beeinflussen.

Alle Encodierungseinstellungen wurden auf einem Beispielvideo mit 720x448 @30000/1001 fps getestet, die Zielbitrate war 900kbps und der Rechner war ein AMD-64 3400+ mit 2400 MHz im 64bit-Modus. Jede Encodiereinstellung zeichnet sich aus durch die gemessene Encodiergeschwindigkeit (in Frames pro Sekunde) und den PSNR-Verlust (in dB) im Vergleich zu Einstellungen für "sehr hohe Qualität". Bitte habe Verständnis, dass du abhängig von deiner Quelldatei, deinem Rechnertyp und Entwicklungsfortschritten sehr unterschiedliche Resultate erzielen wirst.

BeschreibungEncodieroptionenGeschwindigkeit (in fps)Relativer PSNR-Verlust (in dB)
Sehr hohe Qualitätvcodec=mpeg4:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:predia=2:dia=2:vmax_b_frames=2:vb_strategy=1:precmp=2:cmp=2:subcmp=2:preme=2:qns=26fps0dB
Hohe Qualitätvcodec=mpeg4:mbd=2:trell:v4mv:last_pred=2:dia=-1:vmax_b_frames=2:vb_strategy=1:cmp=3:subcmp=3:precmp=0:vqcomp=0.6:turbo15fps-0.5dB
Schnellvcodec=mpeg4:mbd=2:trell:v4mv:turbo42fps-0.74dB
Echtzeitvcodec=mpeg4:mbd=2:turbo54fps-1.21dB

7.3.5. Maßgeschneiderte inter/intra-Matrizen

Mit diesem Feature von libavcodec bist du in der Lage, eigene inter- (I-Frames/Keyframes) und intra-Matrizen (P-Frames/predicted Frames) zu setzen. Es wird von vielen Codecs unterstützt: mpeg1video und mpeg2video sollen damit funktionieren.

Eine typische Anwendung dieses Features ist, die von den KVCD-Specifikationen bevorzugten Matrizen zu setzen.

Die KVCD "Notch" Quantisierungsmatrix:

Intra:

8  9 12 22 26 27 29 34
9 10 14 26 27 29 34 37
12 14 18 27 29 34 37 38
22 26 27 31 36 37 38 40
26 27 29 36 39 38 40 48
27 29 34 37 38 40 48 58
29 34 37 38 40 48 58 69
34 37 38 40 48 58 69 79

Inter:

16 18 20 22 24 26 28 30
18 20 22 24 26 28 30 32
20 22 24 26 28 30 32 34
22 24 26 30 32 32 34 36
24 26 28 32 34 34 36 38
26 28 30 32 34 36 38 40
28 30 32 34 36 38 42 42
30 32 34 36 38 40 42 44

Anwendung:

$ mencoder input.avi -o output.avi -oac copy -ovc lavc -lavcopts inter_matrix=...:intra_matrix=... 

$ mencoder input.avi -ovc lavc -lavcopts
vcodec=mpeg2video:intra_matrix=8,9,12,22,26,27,29,34,9,10,14,26,27,29,34,37,
12,14,18,27,29,34,37,38,22,26,27,31,36,37,38,40,26,27,29,36,39,38,40,48,27,
29,34,37,38,40,48,58,29,34,37,38,40,48,58,69,34,37,38,40,48,58,69,79
:inter_matrix=16,18,20,22,24,26,28,30,18,20,22,24,26,28,30,32,20,22,24,26,
28,30,32,34,22,24,26,30,32,32,34,36,24,26,28,32,34,34,36,38,26,28,30,32,34,
36,38,40,28,30,32,34,36,38,42,42,30,32,34,36,38,40,42,44 -oac copy -o svcd.mpg

7.3.6. Beispiel

Jetzt hast du gerade eben deine brandneue Kopie von Harry Potter und die Kammer des Schreckens gekauft (natürlich die Breitbildedition), und du willst diese DVD so rippen, dass du sie deinem Home Theatre PC hinzufügen kannst. Dies ist eine Region-1-DVD, also ist sie NTSC. Das unten stehende Beispiel wird auch auf PAL zutreffen, nur dass du -ofps 24000/1001 weglässt (weil die Ausgabeframerate die gleiche ist wie die Eingabeframerate), und logischerweise werden die Ausschnittsabmessungen anders sein.

Nach dem Start von mplayer dvd://1, verfolgen wir den detailliert in der Sektion Wie mit telecine und interlacing in NTSC-DVDs umgehen beschriebenen Prozess und entdecken, dass es progressive Video mit 24000/1001 fps ist, was bedeutet, dass wir keinen inverse telecine-Filter wie pullup oder filmdint anwenden müssen.

Als Nächstes wollen wir das passende Ausschnittsrechteck bestimmen, also verwenden wir den cropdetect-Filter:

mplayer dvd://1 -vf cropdetect

Stelle sicher, dass du einen voll gefüllten Frame anstrebst (wie zum Beispiel eine helle Szene, nach den Eröffnungs-Credits und Filmlogos), und dass du diese Ausgabe in MPlayers Konsole siehst:

crop area: X: 0..719  Y: 57..419  (-vf crop=720:362:0:58)

Wir spielen den Film dann mit diesem Filter ab, um seine Korrektheit zu testen:

mplayer dvd://1 -vf crop=720:362:0:58

Und wir sehen, dass er einfach perfekt aussieht. Als Nächstes vergewissern wir uns, dass Breite und Höhe ein Vielfaches von 16 sind. Die Breite ist gut, aber die Höhe ist es nicht. Da wir in der 7-ten Klasse in Mathe nicht gefehlt haben, wissen wir, dass das am nähesten liegende Vielfache von 16 kleiner als 362 der Wert 352 ist (Taschenrechner ist erlaubt).

Wir könnten einfach crop=720:352:0:58 verwenden, aber es wäre nett, ein bisschen von oben und ein bisschen von unten wegzunehmen, sodass wir zentriert bleiben. Wir haben die Höhe um 10 Pixel schrumpfen lassen, aber wir wollen das y-Offset nicht um 5 Pixel erhöhen, da dies eine ungerade Zahl ist und die Qualität nachteilig beeinflussen würde. Statt dessen werden wir das y-Offset um 4 Pixel erhöhen:

mplayer dvd://1 -vf crop=720:352:0:62

Ein anderer Grund, Pixel von beidem - oben und unten - abzuschnipseln ist, dass wir sicher gehen wollen, jegliches halbschwarze Pixel eliminiert zu haben, falls welche existieren. Beachte, falls das Video telecined ist, stelle sicher, dass der pullup-Filter (oder für welchen umgekehrten telecine-Filter auch immer du dich entschieden hast) in der Filterkette auftaucht, bevor du zuschneidest. Ist es interlaced, deinterlace es vor dem Zuschneiden. (Wenn du dich entscheidest, interlaced Video beizubehalten, dann vergewissere dich, dass das vertikale crop-Offset ein Vielfaches von 4 ist.)

Wenn du wirklich besorgt um den Verlust dieser 10 Pixel bist, ziehst du statt dessen etwa das Herunterskalieren der Abmessungen auf das am nächsten liegende Vielfache von 16 vor. Die Filterkette würde dann etwa so aussehen:

-vf crop=720:362:0:58,scale=720:352

Das Video auf diese Art herunter zu skalieren wird bedeuten, dass eine kleine Menge Details verloren geht, obwohl es vermutlich nicht wahrnehmbar sein wird. Hoch zu skalieren führt zu niedrigerer Qualität (es sei denn, du erhöhst die Bitrate). Ausschneiden sondert sämtliche dieser Pixel aus. Es ist ein Kompromiss, den du unter allen Umständen in Betracht ziehen solltest. Zum Beispiel, wenn das DVD-Video für das Fernsehen hergestellt wurde, solltest du vertikales Skalieren vermeiden, da das Zeilensampling mit der Art und Weise korrespondiert, für die der Inhalt ursprünglich aufgenommen wurde.

Bei der Überprüfung sehen wir, dass unser Film ordentlich Action enthält und sehr viele Details, also wählen wir 2400Kbit für unsere Bitrate.

Wir sind nun bereit, die 2-pass Encodierung durchzuführen. Erster Durchlauf:

mencoder dvd://1 -ofps 24000/1001 -oac copy -vf pullup,softskip,crop=720:352:0:62,hqdn3d=2:1:2 -ovc lavc \
  -lavcopts vcodec=mpeg4:vbitrate=2400:v4mv:mbd=2:trell:cmp=3:subcmp=3:mbcmp=3:autoaspect:vpass=1 \
  -o Harry_Potter_2.avi

Und der zweite Durchlauf ist derselbe, außer dass wir vpass=2 festlegen:

mencoder dvd://1 -ofps 24000/1001 -oac copy -vf pullup,softskip,crop=720:352:0:62,hqdn3d=2:1:2 -ovc lavc \
  -lavcopts vcodec=mpeg4:vbitrate=2400:v4mv:mbd=2:trell:cmp=3:subcmp=3:mbcmp=3:autoaspect:vpass=2 \
  -o Harry_Potter_2.avi

Die Optionen v4mv:mbd=2:trell werden die Qualität außerordentlich erhöhen, auf Kosten der Encodierdauer. Es gibt einen kleinen Grund, diese Optionen auszulassen, wenn das Primärziel die Qualität ist. Die Optionen cmp=3:subcmp=3:mbcmp=3 wählen eine Vergleichsfunktion, die eine höhere Qualität liefert als die Standardeinstellungen. Du darfst mit diesem Parameter rumexperimentieren (ziehe die Manpage zu möglichen Werten zu Rate) da verschiedene Funktionen abhängig vom Quellmaterial einen starken Einfluss auf die Qualität haben. Wenn du zum Beispiel meinst, dass libavcodec zu viele Blockartefakte produziert, könntest du ja das experimentelle NSSE als Vergleichsfunktion via *cmp=10 wählen.

Für diesen Film wird das resultierende AVI 138 Minuten lang und nahezu 3GB groß sein. Und weil du erzählt hast, dass eine große Datei nichts ausmacht, ist dies eine perfekt akzeptierbare Größe. Wolltest du sie aber kleiner haben, könntest du eine niedrigere Bitrate hernehmen. Erhöhte Bitraten haben verminderte Rückgaben, während wir also deutlich eine Verbesserung von 1800Kbit nach 2000Kbit sehen, ist es oberhalb 2000Kbit nicht so auffällig. Fühl dich frei solange herum zu experimentieren bis du glücklich bist.

Weil wir das Quellvideo durch einen Denoise-Filter geschickt haben, könntest du einige davon während des Playbacks wieder hinzufügen wollen. Dies zusammen mit dem Nachbearbeitungsfilter spp verbessert die Wahrnehmung der Qualität drastisch und hilft dabei, blockhafte Artefakte aus dem Video zu eliminieren. Mit MPlayers Option autoq kannst du den Nachbearbeitungsaufwand des spp-Filters abhängig von der verfügbaren CPU variieren. An dieser Stelle kannst du auch Gamma- und/oder Farbkorrektur zur besten Anpassung an dein Display verwenden, wenn du willst. Zum Beispiel:

mplayer Harry_Potter_2.avi -vf spp,noise=9ah:5ah,eq2=1.2 -autoq 3