Frage zu Anti-Aliasing in Videos

DaPhreak

Primus inter pares
ID: 30143
L
8 Mai 2006
2.418
295
Hallo ihr lieben,

ich hoffe ihr könnt mir helfen. Ich erstelle gerade eine Animation, die am Ende in einer Präsentation als Video gezeigt werden soll. Ich möchte nun erreichen, dass das Video sauber aussieht und ruckelfrei spielt und habe da so meine Probleme damit.

Zunächst sei gesagt, dass ich das ganze in Matlab mache(-n muss), was für solche Zwecke sicherlicht nicht die beste Software ist. Um meinen Workflow zu optimieren würde ich aber nur sehr ungern auf externe Software setzen und versuche daher, alle Berechnungen selbst zu machen.

Um das Problem zu demonstrieren folgendes einfaches Beispiel: Eine Kugel hüpft durch einen Würfel und prallt dabei an den Seiten ab. Im allerersten Versuch sah das ungefähr so aus:

https://vimeo.com/78988200

Ganz klar, haufenweise Aliasing. Ich habe dann also jedes Frame durch einen Antialiasing-Filter geschickt. Neues Ergebnis:

https://vimeo.com/78987613

Schon mal viel besser. Aliasing per Frame ist also nicht das Problem, aber: von Frame zu Frame hüpft es deutlich. Es ruckelt. Die Bewegung ist zu schnell, ergo: ich habe immer noch Aliasing entlang der Zeitachse.

Um das zu lösen habe ich zunächst mal mehr Frames berechnet. Statt 25 Frames für eine Sekunde sagen wir 75 oder 100. Die Frage ist nur, was mache ich dann damit? Ich will am Ende ja schon wieder zurück auf 25fps (Videocodecs kommen mit deutlich mehr als 25 fps nicht so gut aus wie mir scheint). Daher war meine Idee, ähnlich wie beim normalen Antialiasing jetzt wieder eine geeignete "Tiefpass-Filterung" anzuwenden, also die zusätzlichen Frames so miteinander zu verrechnen, dass am Ende wieder 25 Frames rauskommen. Ein zeitliches Anti-Aliasing-Filter quasi.

Die Frage ist nun:
:arrow: Bin ich damit auf dem richtigen Weg oder wie würde man sowas normalerweise angehen?
:arrow: Wie entwerfe ich die Filterkoeffizienten dieses Filters? Für das Per-Frame-AA habe ich ein Frame in höherer Auflösung gerendert und dann mit Bilinearinterpolation runterskaliert. Ich wüsste jetzt auf Anhieb nicht so richtig wie ich das entlang der Zeitachse mache.



Hier ein Beispiel wo ich 3-fach oversampled habe (also 75fps) und dann immer drei Frames zu einem kombiniert habe, mit der Wichtung 1/4, 1/2, 1/4:

https://vimeo.com/78987614

Sieht schon besser aus, reicht aber noch nicht. Ich probier's grade mit höherem Oversampling-Faktor.

Zum Vergleich, ein Frame ohne AA und mit 3x zeitlichem AA:

ohne: , mit:
 
Also ich seh’ beim letzten Video kein Ruckeln mehr…
Falls du aber tatsächlich höhere Ansprüche hast, würde ich die Oversampling-Rate direkt deutlich erhöhen. So stark, dass du tatsächlich Bewegungsunschärfe siehst, wenn du einen einzelnen Frame betrachtest… also so, als ob man ein Foto mit zu langer Belichtung gemacht hat und nicht, als ob man 3 verschiedene Fotos halbtransparent übereinander gelegt hat.
Wäre zumindest meine Idee :D
 
Also ich seh’ beim letzten Video kein Ruckeln mehr…

Naja es ruckelt nicht sehr merklich, aber irgendwie sieht die Bewegung trotzdem nicht "flüssig" aus. Für mich fühlt es sich immer noch künstlich an.

Falls du aber tatsächlich höhere Ansprüche hast, würde ich die Oversampling-Rate direkt deutlich erhöhen. So stark, dass du tatsächlich Bewegungsunschärfe siehst, wenn du einen einzelnen Frame betrachtest…

Jep, das wäre das Ziel. So weit oversamplen, dass die Bewegung in der Projektion weniger als 1 Pixel pro Frame ausmacht, dann kann man das schön sauber verwischen, dass es nach Bewegungsunschärfe aussieht. Dann sollte es flüssig aussehen.

Nur wie designe ich dann den Filter dafür? Gauss-Tiefpass? Clever wäre eigentlich (fällt mir jetzt grad ein), ein Hann-Fenster zu nehmen. Wenn man die geeignet überlappen lässt summieren sie sich am Ende wieder zu eins auf.


Hier der aktuelle Stand mit 5x oversampling: https://vimeo.com/79083511



Vielleicht gleich noch eine andere Frage: jemand einen Tipp für eine gute Software um Videos zu komprimieren? Ich erzeuge zunächst uncompressed AVI, das ist aber locker mal > 200MBit/s, also für 5 Sekunden Video schon jenseits der 100 MB. Als WMV in vernünftiger Qualität hat das nicht viel mehr als 1-2 MB. Früher habe ich dafür den Windows Media Encoder genommen, aber den bekomm ich unter x64 nicht mehr zum Laufen. Dann eine Zeit lang SUPER, was bisher auch immer ging, mich aber gestern zu einem Update gezwungen hat und seitdem habe ich Probleme die alte Qualität zu erreichen (egal wie hoch ich die Bitrate einstelle, ich bekomme immer hässliche Kompressionsartefakte). Alternativen?
 

Danke! Ansich ist SUPER zwar auch nur ein Frontend für FFmpeg (und für den MEncoder) aber die Probleme die ich seit der letzten Version damit hatte mögen am Frontend selbst liegen, insofern keine üble Idee es mit FFmpeg selbst noch mal zu versuchen.

Alternativ bin ich zwischenzeitlich auf demn Microsoft Expression Encoder gestoßen, für meinen aktuellen Zweck tut der seinen Dienst auch nicht ganz schlecht.
 
Sorry für den Doppelpost, aber das vorläufige Endergebnis wollte ich euch nicht vorenthalten:

https://vimeo.com/79149365

10x oversampling (250fps), runtergerechnet auf 25fps mit einem 50% überlappenden Hann-Fenster (Basisbreite 21 Frames). Hier das entscheidende Frame:



*whooosh*

Ich bin mit dem Ergebnis so zwar recht zufrieden, frage mich aber trotzdem ob der Aufwand nötig war. Das muss doch einfacher gehen. ;)
 
Zuletzt bearbeitet:
Vielleicht gleich noch eine andere Frage: jemand einen Tipp für eine gute Software um Videos zu komprimieren? Ich erzeuge zunächst uncompressed AVI, das ist aber locker mal > 200MBit/s, also für 5 Sekunden Video schon jenseits der 100 MB. Als WMV in vernünftiger Qualität hat das nicht viel mehr als 1-2 MB. Früher habe ich dafür den Windows Media Encoder genommen, aber den bekomm ich unter x64 nicht mehr zum Laufen. Dann eine Zeit lang SUPER, was bisher auch immer ging, mich aber gestern zu einem Update gezwungen hat und seitdem habe ich Probleme die alte Qualität zu erreichen (egal wie hoch ich die Bitrate einstelle, ich bekomme immer hässliche Kompressionsartefakte). Alternativen?

Ich weiß nicht, ob auch AVI als finales Output-Format geht, aber wenn, dann würde ich VirtualDub empfehlen (mit den entsprechenden Video-Codecs unter Windows installiert). VirtualDub kann auch aus Einzelbildern (Still Frames, z.B. bmp, jpg oder vorzugsweise png) AVIs erstellen. Das nehme ich meist für den Output in ein komprimiertes Format. Mit XVid oder DivX ist es auch wesentlich schneller als ffmpeg, avisynth (oder SUPER, der aber auch nur auf 3rd party sw wie ffmpeg zurückgreift).