Einsteigerhilfe

Was ist Encoden überhaupt?

Fälschlicherweise denken einige Leute, dass Encoden nur das Muxen von Untertiteln in ein Video oder das Erstellen von Hardsubs ist. Dem ist aber nicht so, jedenfalls nicht ganz. Das können zwar Aufgaben vom Encoder sein, ist aber nicht das wesentliche.
Kurzgefasst könnte man den Prozess so auffassen:
Rohes Material (Transportstream, BDMV, DVDiso) -> Filtern
-> x264 Encode-Einstellung -> Encodetes Material

Hier befasse ich mich hauptsächlich mit dem Schritt „Filtern“.
Für den Schritt „x264 Encode-Einstellungen“, bitte HIER klicken.

 

Was für Programme brauche ich?

Ich setze mein Encode-Pack hier erst mal als Voraussetzung.
Wichtig wären nämlich Avisynth + Plugins, vcredist, einige .ddl Dateien, DGIndex (nur bei Transportstreams) und AvsPmod für den Anfang.
avs4x26x und x264 (tmod) für später.

Wie schreibe ich ein .avs-Script?

Sofern Avisynth installiert ist, die Plugins in dem dazugehörigen „plugins“ Ordner sich befinden, alle .ddl Dateien richtig kopiert sind und vcredist installiert ist, kann man AvsPmod (AvsPmod.exe) starten.
Bei AvsPmod handelt es sich um eine GUI für Avisynth. Sobald es gestartet ist, kann man mit dem Skriptschreiben schon loslegen.

 

Mein erster Skript: Der Anfang.

#######################################################################

Als erstens bräuchten man das Video. Dieses liegt oftmals in 8-Bit vor.

Um das Video „einzuladen“ gibt es mehrere Filter, z.B.

/* fur: .m2ts, .mp4, .ts (sofern h264) und .mkv */
LWLibavVideoSource("I:\Sub\Encode\test.m2ts") #8-Bit Source
FFVideoSource("I:\Sub\Encode\test.m2ts") #8-Bit Source
LWLibavVideoSource("I:\Sub\Encode\test.m2ts",format="YUV420P16",stacked=true) #10-Bit Source als 16-Bit anzeigen zum weiteren filtern. Umgang mit 16-Bit findest du HIER. 
/* fur: .ts und .vob (sofern MPEG2) */
MPEG2Source("I:\Sub\Encode\test.d2v") #Umgang mit .ts findest du HIER.
#Der Teil mit "DGIndex" trifft auch auf .vob (DVD) zu. Hier wird jedoch kein JIVTC genutzt für IVTC genutzt, aber dazu später mehr.

#######################################################################

Es kann durchaus sein, dass das Video nicht als 23,976 FPS erkannt wird.
(ist oft der Fall mit Crunchyroll-Source)
Dafür hängt man einfach ein „.assumefps(24000,1001)“ dran.
Diese Methode darf und sollte niemals bei Transportstreams oder 29,97 FPS Source genutzt werden!

/* fur: .m2ts, .mp4, .ts (sofern h264) und .mkv */
LWLibavVideoSource("I:\Sub\Encode\test.m2ts").assumefps(24000,1001)
FFVideoSource("I:\Sub\Encode\test.mkv").assumefps(24000,1001)

Alternativ gibt es mit FFVideoSource noch:

FFVideoSource("I:\Sub\Encode\test.mkv", fpsnum = 24000, fpsden = 1001)

Hier ist jedoch Vorsicht geboten. FFVideoSource schneidet so willkürlich Frames weg, nur benutzen, wenn man wirklich Ahnung hat was man da tut!

#######################################################################

Sofern man eine Blu-ray oder DVD hat, welche Interlaced ist bzw. anstatt 23,976 FPS ganze 29,97 FPS besitzt, kann man diese einfach auf 23,976 FPS bringen. Hierbei ist zu beachten, dass das ganze auch bei TV-Source (MPEG2 und h264) funktioniert, jedoch nicht empfehlenswert ist. JIVTC erreicht jedoch deutlich bessere Resultate.

TFM().TDecimate()

#######################################################################

Mittels „TextSub“ kann man Untertitel oder auch Karaoke ins Video einbrennen.

TextSub("hardsub.ass") #Normal
TextSubMod ("hardsub.ass") #für vsfiltermod

#######################################################################

Möchte man Typesets hinzufügen, welche von After Effects kommen, sollte man „insertsign“ nehmen.

insertsign(last, AVISource("test.avi").AssumeFPS(24000, 1001), 200) #bei richtigen Farben
mod_inssign(last, AVISource("test.avi").AssumeFPS(24000, 1001), 0, 75, fix_color=true) #bei falschen Farben

#######################################################################

Sollte die Source schwarze Ränder aufweisen, dann kannst du mit „crop“ diese entfernen oder mittels „fixedges“ neu berechnen lassen.

Crop(links, oben, -rechts, -unten)
Crop(2, 0, -2, -0)
#Spline16Resize(1920,1080) #Es bietet sich an, dass Video nach dem croppen zurück auf die originale Auflösung zu bringen (kann sonst Probleme mit paar Filtern geben)

fixedges(l="d2;d2", r="d2;d2")

Sollten statt schwarze Ränder Halos oder falsche Farben am Rand sein, kann man dies anders lösen.

ContinuityFixer(links, oben, rechts, unten)
ContinuityFixer(2, 2, 2, 2)

ReferenceFixer(blur(1.0),4,4,4,4)
AverageFixer(blur(1.0),4,4,4,4)

#######################################################################

Sollte die Source schwarze Frames (z.B. Anfang/Ende) aufweisen, dann kannst du mit „trim“ diese entfernen.

Trim(24,0)
#Trim im Format Trim(von Frame,bis Frame) schreiben.
#Verkettung über "++" z.B. Trim(24,300)++Trim(400,2000)
#0 am Ende bedeutet bis zum Ende des Videos

#Beispiel:
#Trim Anfang/Ende vom Video: Trim(24,0)++Trim(0,34000)

#######################################################################

Möchte man ein Video auf das bereits existierende Video legen bzw. einen Abschnitt (Overlay), kann man dies ganz einfach tun.

op=LWLibavVideoSource("Test[CR].mkv").trim(1319,3475).AddLogo("BSTBS 1920x1080.lgd",pos_x=3,pos_y=3) #Das Opening von einer Crunchyroll-Source + TV-Logo
sct1=LWLibavVideoSource("Test[CR].mkv").trim(3690,4276).crop(0,936,0,-72) #Die Stelle wo in der TV-Source Scrollingtext ist, jedoch bei Crunchyroll nicht

trim(0,1319)++trim(1320,3475).Overlay(op)++trim(3476,3688)++trim(3689,4275).Overlay(sct1,y=936,mode="blend")++trim(4276,0)

#######################################################################

Möchte man die Source z.B. auf 720p bringen, kann man „Spline“ nutzen. Über das Runterskalieren einer Source findest du einen kompletten Artikel HIER.

Spline36Resize(1280,720) #BD, TV

#######################################################################

Sollte man eine DVD Source haben, lohnt es sich diese auf 576p zu bringen.

nnedi3_rpow2(2).Spline36Resize(1024,576)

#######################################################################

Sollte die Source Aliasing aufweisen, kann man dies auf Kosten von langer Encodezeit (je nach Stärke) beheben. Mittels „Anti-Aliasing“ oder auch „Kantenglätung“ geschieht dies. PC-Spielern sollte der Begriff schon etwas sagen. Auftreten tut das z.B. wenn Linien nicht gerade verlaufen und diese dann eine Art „Treppenstufen“ haben.

xaa(mode="Nnedi3") #Schwaches AA nur auf Konturen
nnedi3_rpow2(2) #Schwaches AA
xaa(mode="eedi3") #Starkes AA nur auf Konturen
eedi3_rpow2(2) #Starkes AA
xaa(mode="eedi3+nnedi3") #Sehr Starkes AA nur auf Konturen

#######################################################################

Sollte die Source relativ unscharf sein und es besteht Bedarf zum nachschärfen, kann man dies auch tun. Jedoch rate ich hier von Vorsicht. Schärfer ist nicht immer besser, wenn man es übertreibt sind Konturen viel zu dick oder Farbübergange in dunklen Bereichen schlechter (z.B. Augenbrauen).

LSFmod(strength=15)

#######################################################################

Sollte die Source Banding aufweisen, gibt es verschiedene Möglichkeiten zum fixen. Hier bietet es sich besonders an im 16-Bit Farbraum zu debanden.
Mehr dazu HIER. Banding selber ist einfach gehalten ein grober Übergang bei Farben.

GradFun3mod() #Entfernt Banding mittels Smoothen (gut für wenig Banding)
f3kdb(y=55,Cb=35,Cr=35,grainC=0,grainY=0,keep_tv_range=true,input_depth=8, output_depth=8) #Entfernt Banding mittels Dithern (gut für viel Banding)
f3kdbmod16x() #f3kdb mit gradfun3-Maske. Diesen empfehle ich zu nutzen. Nur 16-Bit fähig, mehr HIER über 16-Bit.

#######################################################################

Sollte die Source Halos ausweisen, kannst du diese ganz einfach „cleanen“.
„Halos“ sind eine Art Umrandung um Konturen, welche recht transparent scheinen.
Im Gegensatz zu Ringing sind diese heller und sauberer.

EdgeCleaner(hot=true)
DeHalo_Alpha()

#######################################################################

Sollte die Source Ringing ausweisen, kannst du diese ganz einfach „cleanen“.
Diese treten oft bei einer DVD-Source auf oder bei zu viel Schärfe bei TV- und BD-Material auf.
Ringing und Halos sind sehr ähnlich. Ringing nimmt jedoch mehr eine „Artefaktform“ um Konturen an.

HQDeringmod()
nnedi3_rpow2(2)

#######################################################################

Sollte die Source Blocking aufweisen, hilft es diese zu „deblocken“ oder zu verwaschen. Dies tritt sehr oft bei TV-Material auf. Wie der Name schon sagt, kann man sich das als Blöcke vorstellen, welche in z.B. Actionszenen auftauschen, da die Bitrate zu gering ist.
Es ist nicht zu empfehlen Deblock aufs ganze Video zu packen. Hier muss man entweder Szenenfiltern oder es automatisiert machen.

Deblock_QED() #wenig Blocking - Szenenfiltern
dfttest(sigma=15,tbsize=1,y=true,u=true,v=true) #viel Blocking - Szenenfiltern

autodeblock2() #automatisiertes Deblocking

#######################################################################

Hat die Source recht viel Noise oder dynamisches Grain, muss man diese „denoisen“/“degrainen“. Unter „Noise“ versteht man kleine Artefakte oder Unsauberkeiten, welche im Bild auftauchen. „Grain“ hingegen ist mehr oder weniger dasselbe, nur sind diese in vielen Fällen gewollt. Von „Noise“ spricht man eher bei einer TV-Source (sieht unschöner aus).

SMDegrainChromaFix() #Eignet sich super für wenig Noise & Grain
QTGMC(InputType=1, SourceMatch=3, TR0=1, TR1=1, TR2=0) #Eignet sich super für extrem viel Noise & Grain

#######################################################################

Möchte man jedoch Grain bewusst hinzufügen (z.B. Banding überdecken), kann man das entweder einzeln oder mit beim Debanden machen.

#Dynamisches Grain (Beweglich in jedem neuen Frame)
Dither_add_grain16(0.2, 0, 1)
f3kdb(..., grainC=15,grainY=15,dynamic_grain=true)

#Statisches Grain (Feste für das gesamte Video)
Dither_add_grain16(0.2, 0, 100)
GradFun3mod(smode=1, staticnoise=true, mode=6, ampo=1, ampn=1.8)
f3kdb(..., grainC=15,grainY=15,dynamic_grain=false)

#######################################################################

Sich nur Luma/Chroma anzeigen lassen (für z.B. Banding-Suche)

#Luma
histogram(mode="luma")

#Chroma
YToUV(UTOY(),VTOY())
mt_lut(Y=-128,U=2,V=2)

#######################################################################

Das Filtern auf bestimmte Frames erfolgt über ReplaceFrameSimple

deband1 = gradfun3mod()
ReplaceFramesSimple(deband1, mappings="[startframe,endframe][200 300]")

#######################################################################