7.3. Encodieren mit der libavcodec Codecfamilie

7.3. Encodieren mit der `libavcodec` Codecfamilie
Zurück | Kapitel 7. Encodieren mit MEncoder | Weiter

## 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 Videocodecs | Beschreibung
--- | ---
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 Audiocodecs | Beschreibung
--- | ---
ac3 | Dolby Digital (AC-3)
adpcm_* | Adaptive PCM-Formate - siehe begleitende Tabelle
flac | Free Lossless Audio Codec (FLAC)
g726 | G.726 ADPCM
libamr_nb | 3GPP Adaptive Multi-Rate (AMR) narrow-band
libamr_wb | 3GPP Adaptive Multi-Rate (AMR) wide-band
libfaac | Advanced Audio Coding (AAC) - verwendet FAAC
libgsm | ETSI GSM 06.10 full rate
libgsm_ms | Microsoft GSM
libmp3lame | MPEG-1 audio layer 3 (MP3) - verwendet LAME
mp2 | MPEG-1 Audio Layer 2
pcm_* | PCM-Formate - siehe begleitende Tabelle
roq_dpcm | Id Software RoQ DPCM
sonic | experimenteller verlustbehafteter FFmpeg-Codec
sonicls | experimenteller verlustfreier FFmpeg-Codec
vorbis | Vorbis
wma1 | Windows Media Audio v1
wma2 | Windows 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 Codecname | Beschreibung
--- | ---
pcm_s32le | signed 32-bit little-endian
pcm_s32be | signed 32-bit big-endian
pcm_u32le | unsigned 32-bit little-endian
pcm_u32be | unsigned 32-bit big-endian
pcm_s24le | signed 24-bit little-endian
pcm_s24be | signed 24-bit big-endian
pcm_u24le | unsigned 24-bit little-endian
pcm_u24be | unsigned 24-bit big-endian
pcm_s16le | signed 16-bit little-endian
pcm_s16be | signed 16-bit big-endian
pcm_u16le | unsigned 16-bit little-endian
pcm_u16be | unsigned 16-bit big-endian
pcm_s8 | signed 8-bit
pcm_u8 | unsigned 8-bit
pcm_alaw | G.711 A-LAW
pcm_mulaw | G.711 μ-LAW
pcm_s24daud | signed 24-bit D-Cinema Audioformat
pcm_zork | Activision Zork Nemesis
adpcm_ima_qt | Apple QuickTime
adpcm_ima_wav | Microsoft/IBM WAVE
adpcm_ima_dk3 | Duck DK3
adpcm_ima_dk4 | Duck DK4
adpcm_ima_ws | Westwood Studios
adpcm_ima_smjpeg | SDL Motion JPEG
adpcm_ms | Microsoft
adpcm_4xm | 4X Technologies
adpcm_xa | Phillips Yellow Book CD-ROM eXtended Architecture
adpcm_ea | Electronic Arts
adpcm_ct | Creative 16->4-bit
adpcm_swf | Adobe Shockwave Flash
adpcm_yamaha | Yamaha
adpcm_sbpro_4 | Creative VOC SoundBlaster Pro 8->4-bit
adpcm_sbpro_3 | Creative VOC SoundBlaster Pro 8->2.6-bit
adpcm_sbpro_2 | Creative VOC SoundBlaster Pro 8->2-bit
adpcm_thp | Nintendo GameCube FMV THP
adpcm_adx | Sega/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.

Beschreibung | Encodieroptionen | Geschwindigkeit (in fps) | Relativer PSNR-Verlust (in dB)
--- | --- | --- | ---
Sehr hohe Qualität | `vcodec=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=2` | 6fps | 0dB
Hohe Qualität | `vcodec=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:turbo` | 15fps | -0.5dB
Schnell | `vcodec=mpeg4:mbd=2:trell:v4mv:turbo` | 42fps | -0.74dB
Echtzeit | `vcodec=mpeg4:mbd=2:turbo` | 54fps | -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

Zurück | Nach oben | Weiter
7.2. Wie mit telecine und interlacing in NTSC-DVDs umgehen | Zum Anfang | 7.4. Encodieren mit dem `Xvid`-Codec