Ich suche ein Verfahren, mit dem ich Animationen (Folge von Einzelbildern in Form von Pixelbuffern) effizient komprimieren kann. Der wesentliche Punkt ist, dass die Animation zeitweise statisch ist, dass sich das Bild also insgesamt (oder in großen Bildbereichen) zeitweise nicht ändert. In diesen statischen Bereichen muss das reproduzierte Bild nach kurzer Zeit (<1s) dem Original exakt entsprechen. Dies ist mit MPEG & Co nicht möglich, da diese Verfahren auch statische Szenen verlustbehaftet komprimieren (afaik). Wer hat Hinweise, nach welchen Algorithmen bzw. Implementierungen ich suchen sollte? Wenn möglich, sollte er nicht allzu schwer durchschaubar sein (als Messlatte gebe ich mal an, dass ich die JPEG-Kompression meine verstanden zu haben, während ich MPEG aufgrund der vielen Formate und Spezifikationen ziemlich undurchschaubar finde). Wenn eine Implementation mit Beispielen/Demos als open source verfügbar wäre, bringt es mich noch einen großen Schritt weiter. Danke Julian
:
Hi Julian, wenn dir 256 Farben reichen versuchs mal mit einem "Animated GIF". Die können auch mit den meisten Programmen (inkl. Browser) betrachtet werden und es gibt auch einiges an Software dafür. Für Echtfarben schau mal in der Wikipedia unter "Videoformat", da findest du einen kleinen Überblick gängiger Codecs.
Danke, Animated GIF werde ich mir in jedem Fall ansehen. 8 bit Farbtiefe ist etwas wenig, aber vielleicht lässt sich das Verfahren auf 16 bit erweitern? Kurze Nachfrage: ist Animated GIF verlustfrei (abgesehen von der Farbquantisierung)? Sonst wäre dies schon ein Ausschlusskriterium. Es ist übrigens nicht notwendig, ein Standardformat zu verwenden. Die Animationen werden auf einer Speicherkarte transportiert und können auf dem Zielrechner mit einer noch maßzuschneidernden Software abgespielt werden. Ein weiterer Schritt wird darin bestehen, die Speicherkarte durch einen Infrarotübertragungskanal zu ersetzen.
Hallo Tom, noch ein Nachtrag. Das Problem mit Animated GIF ist, wie ich eben herausgefunden habe, dass es auch schnell bewegte Bereiche verlustfrei komprimiert. Dies ergibt keine ausreichenden Kompressionsraten. Wir brauchen eine Kombination aus i) verlustbehafteter Kompression bewegter Bereiche mit einem vorgegebenen Limit der bps (bits per second) ii) exakter Rekonstruktion statischer Bereiche innerhalb einiger Frames (z.B. 10-50 Frames bei 50fps). Gibt es Verfahren, die automatisch zwischen i) und ii) hin und her schalten? Julian
Ja, Animated GIF's sind verlustfrei. Wie gesagt schau mal auf den Wikipediaartikel. Dort findest du z.B. "HuffYUV" oder "Lagarith" und noch einige mehr, welche verlustfrei arbeiten inkl. weiterführender Links.
Wenn ich das richtig im Kopf habe wird bei MPEG alle paar Frames ein absoluter Stand zwischengeschoben - insbesondere bei starken Bildwechseln. Die Bilder dürften im JPEG-Format gespeichert sein. In der JPEG-Norm ist auch verlustfreie Kompressionsverfahren beschrieben. Ggf. kann man sich daraus was basteln. Fertige Algorithmen dürften aber schwierig zu organisieren sein. Schöne Grüße, Kai
Dazu müsste man wohl festellen können WANN genau das Bild statisch ist. Also laufend die Differenz bilden und schauen ob sich was über die letzten x Frames geändert hat?
>Dazu müsste man wohl festellen können WANN genau das Bild statisch ist. >Also laufend die Differenz bilden und schauen ob sich was über die >letzten x Frames geändert hat? Wenn die letzte Bilddifferenz nach einer verlustbehafteten Kompression ein bestimmtes Limit (in Bytes) unterschreitet, wird ein statisches verlustfreies Bild eingeschoben. Wird anschließend das Limit wieder überschritten, werden die Differenzen in komprimierter Form wieder übertragen. Eine gewisse Hysterese wird hier nötig sein.
Noch etwas: Falls dir die 8 Bit von GIF genügen könntest du auch einfach deinen eigenen Encoder schreiben, welcher bei überschreiten deiner max. Datenrate automatisch nur ein (leicht) modifiziertes Bild abspeichert, welches weniger Speicher verbraucht. Da ja immer ein Differenzbild abgespeichert wird, wird sich nach einigen Bilder automatisch wieder einen 100% Übereinstimmung ergeben. Wichtig dabei ist, dass nicht veränderte Pixel als transparente Pixel abgespeichert werden. Für Vollfarbendarstellung waren mal die Formate APNG und MNG gedacht. Beide sich bis heute jedoch nicht besonders verbreitet.
Kannst /darfst du weitere Angaben machen um welche Art von Daten es sich handelt?
// schrieb: > Dazu müsste man wohl festellen können WANN genau das Bild statisch ist. > Also laufend die Differenz bilden und schauen ob sich was über die > letzten x Frames geändert hat? So würde ich auch vorgehen. Bild 1 komplett speichern Differenz Bild2 - Bild1 speichern Differenz Bild3 - Bild2 (alternativ Differenz Bild3 - Bild1) speichern ... Verlustlosen Codec einsetzen An den ... Stellen ggf. wieder Vollbilder einstreuen, wenn die Unordnung in den Differenzbildern zu gross wird, d.h. die Kompressionseffizienz sinkt. Bei den Screenrecordern und/oder VNC Programmen müsste sowas bereits implementiert sein.
@Stefan Daran dachte ich ursprünglich auch - klassischer Fall von Delta-Kompression. Leider funktioniert das oft nicht effektiv, z.B. bei Rauschen oder wenn sich Vieles ändert. In meinem Fall waren es Aufnahmen von Webcambildern.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.