libavcodec
stellt einfache Encodierung für eine Menge interessanter Video- und Audioformate
zur Verfügung.
Du kannst folgende Codecs encodieren (mehr oder weniger aktuell):
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
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.
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 |
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.
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 |
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:
$ mencoderinput.avi
-ooutput.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
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