2008-09-15 8 views
2

Ich verwende Windows Media Format SDK, um den Desktop in Echtzeit zu erfassen und in einer WMV-Datei zu speichern (eigentlich ist dies eine zu starke Vereinfachung meines Projekts, aber das ist der relevante Teil). Zum Codieren verwende ich den Codec Codec Windows Media Video 9 Screen, weil er sehr effizient für Bildschirmaufnahmen ist und praktisch jedem zur Verfügung steht, ohne dass etwas installiert werden muss, da der Codec in der Windows Media Player 9-Laufzeit enthalten ist (in Windows XP SP1 enthalten). .Erfassen des Desktops mit Windows Media Format (WMF)

Ich mache BITMAP-Screenshots mit den GDI-Funktionen und füttere diese BITMAPs dem Encoder. Wie Sie sich denken können, ist das Aufnehmen von Screenshots mit GDI langsam und ich bekomme den Bildschirmcursor nicht, den ich den BITMAPs manuell hinzufügen muss. Die BITMAPs, die ich anfänglich bekomme, sind DDBs, und ich muss diese in DIBs umwandeln, damit der Encoder sie versteht (RGB-Eingang), und das braucht mehr Zeit.

Das Starten eines Profilers zeigt, dass etwa 50% der Zeit in WMVCORE.DLL, dem Encoder, verbracht wird. Dies ist natürlich zu erwarten, da die Kodierung CPU-intensiv ist.

Die Sache ist, es gibt etwas namens Windows Media Encoder, das mit einem SDK kommt, und kann Screen Capture mit dem gewünschten Codec auf eine einfachere und CPU-freundliche Weise tun.

Das WME basiert auf WMF. Es ist eine höhere Hebelbibliothek und hat auch .NET-Bindungen. Ich kann es nicht in meinem Projekt verwenden, da dies unerwünschte Abhängigkeiten mit sich bringt, die ich vermeiden muss.

Ich frage nach der Methode, die WME zur Einspeisung von Probendaten in den WMV-Encoder verwendet. Die Kodierung erfolgt mit WME genau so, wie es bei meiner Anwendung mit WMF geschieht. WME ist effizienter als meine Anwendung, weil es eine viel effizientere Art der Übertragung von Videodaten an den Encoder bietet. Es ist nicht auf langsame GDI-Funktionen und DDB-> DIB-Konvertierungen angewiesen.

Wie wird es gemacht?

Antwort

0

Es ist Alter her, dass ich jede Win32-Codierung getan habe, aber AFAIK, WMF als Format ist im Grunde eine Liste der GDI-Befehle und deren Parameter, die erklären würde, warum es viel effizienter zu kodieren ist ...

Sie müssten wahrscheinlich in den GDI-Kontext der obersten Ebene einhaken (wie es bei Remote Desktop der Fall ist) und die GDI-Befehle erfassen, wie sie heißen. Ich erinnere mich, dass es einen Weg gibt, einen WMF-Ausgabe-GDI-Kontext zu erstellen, was bedeutet, dass Sie in der Lage sein können, Anrufe auf irgendeine Weise zu delegieren.

Ich rate hier, aber Sie können möglicherweise Beispiel Code für die oben genannten in den TightVNC/QuickVNC für Windows-Projekte finden, da sie so etwas tun müssten, um Änderungen auf dem Bildschirm auf effiziente Weise zu erfassen.

+0

Ich denke, Sie denken an Windows Metafiles, das ist nicht das gleiche wie Windows Media Format (ein Audio/Video-Encoder.) – jeffm

1

Die Quelle für CamStudio, eine GPL-Screencasting-App, die es schon seit Jahren gibt (kommerziell und dann später open-srcd), könnte nützlich sein?

http://sourceforge.net/project/showfiles.php?group_id=131922

Ich würde vorschlagen, auch an den Eingeweiden des VNC-Clients suchen, obwohl sie wahrscheinlich sehr simpel sind (ich denke nur Screenshots dann greifen die Fliesen jpg'ing die seit der letzten Erfassung geändert haben).

Sie sollten nicht in Erwägung ziehen, WMV9 nicht als Encoder für die On-The-Fly-Codierung zu verwenden, wenn es zu cpu-lastig ist? Vielleicht einen älteren, weniger effizienten Kompressor (wie MS RLE) wie er von HyperCam benutzt wird und dann zu WMV komprimieren?MS RLE ist seit mindestens eine Standard-Installation Win2000 Ich glaube: http://wiki.multimedia.cx/index.php?title=Microsoft_RLE

CamStudio der Lossless-Codec ist GPL (gleiche Verbindung wie oben), die ziemlich gute Kompression bietet (obwohl Sie die DLL in Ihrem Installateur zu bündeln bräuchten) und könnte im laufenden Betrieb verwendet werden, es funktioniert gut mit hoher Kompression auf allen modernen Systemen.

0

Haben Sie die BB FlashBack Bibliothek ausgecheckt?

Ich bin auf einer ähnlichen Jagd, und ich habe gerade angefangen, die BB FlashBack Bibliothek auszuwerten.

Ich bin mir nicht sicher über die externen Abhängigkeiten oder Installation Fußabdruck. Es scheint einen proprietären Codec zu haben, der installiert werden muss, aber die Installation des Codecs kann von der offen gelegten BB FlashBack API gehandhabt werden.

Hüten Sie sich vor, es gibt die Lizenzierung Einschränkungen (Runtime Einstellung von Lizenzschlüsseln, ...)

ich kann Ihnen die CHM aus dem SDK per E-Mail senden, wenn Sie die API vor der Festlegung auf ein lizenziertes bewerten wollen herunterladen.

Dinge, die ich bin in der Mitte der Bewertung: Proper Captures von WPF Ansichten Mauszeigers Größe des gespeicherten Films Tracking Wie ohne proprietären Codec gespeichert Film angezeigt werden (dh SWF-Export)

--Batgar