Ich bin mal wieder in den Tiefen des Videocodings unterwegs und hab mir per MVTools ein Testvideo gebaut, um mir Bewegungsvektoren und Differenzbilder mit/ohne Bewegungskompensation anzuschauen.
Video: http://www.youtube.com/watch?v=AugNK5mdQCk
Skript:
LoadPlugin("C:\Encoding\AviSynth-Plugins\mvtools2.dll")
SetMemoryMax(1500)
SetMTMode(2,4)
# load source clip from PNGs and resize
function CreateClip(string "img_files", int "start", int "end", int "fps", int "width") {
ImageSource(file=img_files, start=start, end=end, fps=fps)
ConvertToYV12(matrix="Rec601")
w = width - width%2
h = round((float(width)/last.width()) * last.height())
LanczosResize(w, h-h%2)
}
# Create motion compensated difference frame
function CreateMCDiffClip(clip SrcClip, clip super, clip vectors) {
comp = MCompensate(SrcClip, super, vectors, scbehavior=false)
Overlay(SrcClip, comp, mode="difference")
}
# add black bar with caption at the top edge of a clip
function AddText(clip clp, string "Text") {
return(clp.
\ AddBorders(0, 38, 0, 0).
\ Subtitle(Text, x=6, y=3, font="Trebuchet MS", size=28, text_color=$ffffff) \
)
}
# ==========================================================================================
Fps = 24
SrcClip = CreateClip("png-1920x818\%08d.png", start=3611, end=4920, fps=Fps, width=956)
# Prepare special clips for ME/MC wiht MVTools
BlockSize = 16
super = MSuper(SrcClip, hpad=BlockSize, vpad=BlockSize)
vectors = MAnalyse(super, blksize=BlockSize)
# create the 3 demo clips: MVs, residual frame with/without MC
VisibleMVClip = MShow(super, vectors).Crop(BlockSize,BlockSize,-BlockSize,-BlockSize)
MCDiffClip = CreateMCDiffClip(SrcClip, super, vectors)
RawDiffClip = Overlay(SrcClip,
\ BlankClip(SrcClip, 1)+SrcClip,
\ mode="difference")
# Add captions and black intro/outro
InOutro = BlankClip(SrcClip, round(Fps/2))
SrcClip = AddText(InOutro + SrcClip + InOutro, "Originalvideo")
VisibleMVClip = AddText(InOutro + VisibleMVClip + InOutro, "Bewegungsvektoren")
MCDiffClip = AddText(InOutro + MCDiffClip + InOutro, "Differenz mit Bewegungskompensierung")
RawDiffClip = AddText(InOutro + RawDiffClip + InOutro, "Differenz ohne Bewegungskompensierung")
# build final frame
top = StackHorizontal(SrcClip.AddBorders(0,0,8,0), VisibleMVClip)
bottom = StackHorizontal(RawDiffClip.AddBorders(0,0,8,0), MCDiffClip).AddBorders(0, 16, 0, 0)
StackVertical(top, bottom)
Alles anzeigen
Über die Differenzbilder stolper ich noch etwas. Normalerweise sind die Dinger ja Graustufen mit 128er-Grau als »keine Differenz«, negative Diffs Richtung schwarz und positive Diffs Richtung weiß. Mit meinem Skript habe ich aber a) Farbe übrig und b) nur »helle« Abweichung. Kann doch nicht sein, dass ich eine Videosequenz erwischt habe, wo es keine negativen Differenzen gibt!
Kann von euch Skript- und sonstigen Experten jemand Licht ins Dunkel bringen? An sich zeigt das Video zwar recht schön, was es zeigen soll*, aber wieso ich solche eigenwilligen Differenzbilder habe, ist mir nicht wirklich klar. Denkfehler? Skriptfehler? Ideen, wie ich normalübliche Differenzbilder hinkriege?
*Nämlich dass Differenzen speichern viel kompressibler ist als volle Einzelbilder und bewegungskompensierte Differenzen nochmal ganz deutlich was bringen.