![]() |
Bitmaps2Video für Windows Media Foundation
Liste der Anhänge anzeigen (Anzahl: 1)
Aktualisierung:
Eine erste Version des Projekts gibt es jetzt auf ![]() Für Details siehe das Readme dort. /Aktualisierung In letzter Zeit habe ich an einem port von Bitmaps2Video von ffmpeg auf Windows Media Foundation gearbeitet, denn mir gefällt nicht, dass es diese ganzen Dlls benötigt. Bevor ich das Resultat auf GitHub hochlade, möchte ich es gern hier vorstellen, da ich nur begrenzte Möglichkeiten zum Testen habe. Außerdem hoffe ich, vielleicht ein paar Tips für noch bestehende Probleme zu bekommen (siehe unten). Die Dokumentation von WMF hat mich schon ein paar Mal an den Rand des Wahnsinns getrieben. Was es tut: Enkodiert eine Serie von Bitmaps als Video, wobei man als Benutzer nur Grundkenntnisse über Videos haben muss. Kann 2 Sorten von Übergängen zwischen Bildern als Beispiel dafür, wie man mehr einbauen kann. Unterstützt Dateiformate .mp4 mit Codecs H264 oder H265, oder .wmv mit Codec WMV3. Benutzt die GPU zum Enkodieren, falls unterstützt, falls nicht, wird Software benutzt. Benutzt parallele Routinen wann immer das Sinn macht. Hat eine experimentelle Routine zum Einfügen von Audio (Muxer). Geht im Moment nur für H264 und WMV3. Was es braucht: VCL-basiert Braucht die hervorragenden MF-headers von ![]() Den Ordner src von MFPack zum Bibliothekspfad hinzufügen, packages müssen nicht installiert werden. Um alle features zu nutzen, braucht es Windows10 oder höher. Delphi-Versionen: Braucht wahrscheinlich mindestens XE3, aber ich habe nur 11.3 zum Testen. Probleme: Ich bin nicht allzu angetan von der Enkodier-Qualität, liegt vielleicht an meiner nVidia-Karte. Der Audio-Muxer müsste eigentlich auch für H265 funktionieren, denn es geht, wenn ich ffmpeg für's muxen nehme. Ich habe bis jetzt nicht rausgekriegt, wie ich Video-clips einfüge. Renate |
AW: Bitmaps2Video für Windows Media Foundation
Errata: uToolsWMF hat eine unit Z_prof in der uses-Liste. Einfach entfernen. Kommt davon, wenn man zu viel Zeug im path hat.
Inzwischen habe ich glaube ich rausgefunden, wie man die Qualität verbessern kann. Um Zeile 270 rum in uBitmap2VideoWMF.pas die folgenden Änderungen machen:
Code:
if succeeded(hr) then
hr := MFCreateAttributes(attribs, 4); //<--------- change to 4 here // this enables hardware encoding, if the GPU supports it if succeeded(hr) then hr := attribs.SetUINT32(MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, UInt32(True)); // this seems to improve the quality of H264 and H265-encodings: {*************** add this *********************************} // this enables the encoder to use quality based settings if succeeded(hr) then hr := attribs.SetUINT32(CODECAPI_AVEncCommonRateControlMode, 3); {**************** /add this *******************************} if succeeded(hr) then hr := attribs.SetUINT32(CODECAPI_AVEncCommonQuality, 100); if succeeded(hr) then hr := attribs.SetUINT32(CODECAPI_AVEncCommonQualityVsSpeed, 100); |
AW: Bitmaps2Video für Windows Media Foundation
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Renate,
es gibt verschiedene Lanczos Varianten. Dein Lanczos sieht bei mir so aus:
Delphi-Quellcode:
Es erzeugt eine Rasterung bei 80% Verkleinerung, siehe Anhang Lanczos.jpg
function LanczosXFilter(Value: Extended; LanczosWidth: Integer): Extended;
var y, yinv: Extended; begin Value := abs(Value); if Value = 0 then Result := 3 else if Value < 1 then begin y := Pi * Value; yinv := 1 / y; Result := sin(3 * y) * sin(y) * yinv * yinv; end else Result := 0; end; Meine Variation von Lanczos erzeugt kein Raster:
Delphi-Quellcode:
Weiter finde ich es problematisch auf 3rd Party MfPack, zu verweisen, das es inzwischen in mehr als 4 unterschiedlichen Versionen mit unterschiedlichen Unitnamen gibt. Daduch erhält dein Package eine Halbwertszeit von MfPack. Nicht gut!
function LanczosXFilter(Value: Extended; LanczosWidth: Integer): Extended;
// Normalisierte SinC Funktion = sin(Pi*x) / (Pi*x) function SinC(Value: Extended): Extended; begin if Value <> 0 then begin Value:= Value * Pi; Result:= Sin(Value) / Value; end else Result:= 1; end; begin if Value < 0 then Value:= -Value; if Value < LanczosWidth then Result:= SinC(Value) * SinC(Value / LanczosWidth) else Result:= 0; end; Auch die Objektorientierte Kapselung mit Class of Funktionen in Records usw. ist total overpowered. Die tatsächlichen WindowAPI Funktionen sind keine Class Funktionen, brauchen das nicht. Liebe Grüße Klaus Schaaff |
AW: Bitmaps2Video für Windows Media Foundation
Zitat:
Hast Du ein Repo, wo ich mir Deine Version mal angucken kann? Zitat:
Inzwischen habe ich den Tip bekommen, mfPack als submodule hinzuzufügen, das muss ich mir aber erstmal zu Gemüte führen.
Code:
Das ist Geschmackssache. Werde ich garantiert nicht ändern. Und in wiefern sind Records overpowered? Ist doch nun wirklich keine "rocket-science":). Mit Klassen und Records zu arbeiten ist einfach viel strukturierter, allein wegen Code-Completion.
Auch die Objektorientierte Kapselung mit Class of Funktionen in Records usw. ist total overpowered.
Im Gegenteil, ich hatte schon eine vage Idee, einigen Media-Foundation-Funktionen ein Klassengerüst zu geben. Dauernd muss man diese Attributs-Namen nachgucken, und wie man sie wohin und wann und wie einlesen muss. Renate |
AW: Bitmaps2Video für Windows Media Foundation
Zitat:
Du hast die Funktion falsch skaliert, da ist es kein Wunder, wenn Mist dabei rauskommt. Meine Filter sind alle auf Weite 1 normalisiert, und die Skalierung auf den Radius mache ich erst, wenn ich die Gewichte berechne. Willst Du auf Weite LanczosWidth umskalieren, musst du das so machen: f_skaliert(value)=1/LanczosWidth*f(value/LanczosWidth). Und wenn dann, wie ich stark annehme, LanczosWidth=3 ist, dann haben wir, schwupp, die gleiche Funktion. Rechne es nach :). Renate |
AW: Bitmaps2Video für Windows Media Foundation
Hallo Renate,
das Ganze ist eine ökonomische Kalkulation. Was möchte ich? Wieviel Mannstunden sind dafür nötig? Was bekomme ich anschließend dafür. Das ist in deinem Fall, nicht ohne weiteres sofort absehbar und dafür würde ich mir an deiner Stelle Zeit lassen. Das Lanczos Raster kann durchaus bei dir korrekt funktionieren, so wie du skalierst. Mir ist damals (vor 10 Jahren) aufgefallen, die Rechenzeiten gehen dort so drastisch in die Höhe, dass ich Lanczos nur der Vollständigkeit aufgenommen habe. Im übrigen habe ich keine GPU-Implementierung. Bei mir sieht die Liste so aus: Nearest Bilinear Bicubisch Mitchell Lagrange BSpline Lanczos Halftone Hier ist Halftone sehr wichtig für Verkleinerungen optimal. Für Vergrößerungen gar nicht zu gebrauchen. Ähnlich alle anderen. Man muss vorher genau wissen, welcher Algorithmus ist gut für Vergrößerungen und welche sind gut für Verkleinerungen. Leider kann ich dein Packet nicht compilieren, da bei mir Delphi 2009 die höchste Version ist. Zur objektorientieren Kapselung, mir reichen die Delphi 7 Implemntierungen vollkommen aus. Und nochmals, das sind nur meine persönlichen Erfahrungen mit dem Thema, wie gesagt vor 10 Jahren. Die gesammte Delphi-Gemeinde scheint zu akzeptieren, dass heute niedrigere Delphi-Versionen ausgeschlossen werden. Das mag ich nicht. Dennoch, es bleibt allein deine Entscheidung. Liebe Grüße Klaus Schaaff |
AW: Bitmaps2Video für Windows Media Foundation
Zitat:
Leider habe ich keine Ahnung, was Delphi 2009 schon alles so kann, aber anonyme Prozeduren kannte das wahrscheinlich noch nicht. Die records sind nicht das Problem, die kann man schnell entkoppeln. Ich habe nur 2006 und 11.3. 2006 war die letzte Pro-Version, die ich mir leisten konnte. Ich würde gerne frühere Versionen unterstützen, aber ohne Test geht das nicht. Ich hab noch eine alte Resampler-Version, die unter 2006 läuft, und die auch ohne threads schon ziemlich schnell war. Wenn es Dich interessiert, kann ich die Version mal salonfähig machen, und hier hochladen, dann hast Du einen Vergleich. Allerdings ohne Demo. Renate |
AW: Bitmaps2Video für Windows Media Foundation
Ohne jetzt den Code zu kennen: Delphi 2009 kannte schon Enhanced Records, aber noch keine (Custom) Managed Records. Und nein: Anonyme Methoden kannte es noch nicht, ebenso wenig enthielt es die Parallel Programming Library.
|
AW: Bitmaps2Video für Windows Media Foundation
Danke, Thomas, damit kann ich schon was anfangen. Die Sachen, die es nicht kann, brauche ich gar nicht unbedingt.
Renate |
AW: Bitmaps2Video für Windows Media Foundation
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Renate,
bevor du eine Delphi 2006 Version vorbereitest, schau dir bitte erst mal den Anhang Hilfe.pdf an. Dort erkennst du meine Intension. Praktische Hilfen, die man wirklich braucht. z.B: Druckgröße Auflösung in [Pixel / Inch], [Pixel / cm], [Pixel / mm]. Da gibt es kein Herumrechnen mehr. Es gibt eine Vorgabe, die man direkt einstellen kann. Das ist es, wenn man ständig Graphik bearbeitet und nicht einmal im Jahr. Das sind meine Vorstellungen eines Expertenprogramms, nicht die, die man in Smartphone Apps findet, in Android oder sonst wo und dann schnell einmal im Jahr unter stark abgespeckten Bedingungen mal was macht. Dort in der Hilfe.pdf Seite 6. Liebe Grüße Klaus Schaaff |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz