C# kleines Aufnahmeprogramm

Techno120

Cadet 3rd Year
Registriert
Mai 2012
Beiträge
48
Hallo, ich würde gerne in C# ein kleines Aufnahmeprogramm programmieren.
Zuerst hatte ich vor mit SlimDX Frames auszuzeichnen, und diese dann mit ffmpeg zusammenzuschneiden. Dies funktioniert aber nicht.

Ich suche eine Klasse, mit der man die aufgenommenen Frames direkt als Frame in eine Videodatei schreiben kann.

Ich habe mir schon folgende Klassen angeschaut:
● A Simple C# Wrapper for the AviFile Library
● Directshow.NET
...

Doch diese funktionieren alle nicht nicht.
Entwerder ist die Qualität der Videos mangelhaft, oder die Video's ließen sich nicht abspielen.

Ich hoffe, dass ihr mir einen Tipp geben könnt, oder jemand einen Source Code für mich hat, den ich mir anschauen kann.

MfG
Techno120 :)
 
AW: kleines Aufnahmeprogramm :)

Das sind doch alles C++ Klassen.
 
AW: kleines Aufnahmeprogramm :)

Techno120 schrieb:
Das sind doch alles C++ Klassen.

Der erste Artikel ist C#, die beiden anderen eher Referenz. Die Sprache ist dabei eigentlich vollkommen egal. Wenn du nicht weißt, wie du C++ Code in C# ausführst, solltest du dir ein etwas trivialeres Programm zum Einstieg überlegen ;)

Was du vorhast, wirst du selber schreiben müssen. Auch wenn das .NET Framework eine Menge bereits mitbringt, so ist es doch kein Lego-Kasten. Mit SlimDX wird es übrigens definitiv gehen, ob du diesen Wrapper allerdings brauchst, sei mal dahin gestellt ;)

Wie auch immer, lies nochmal den Artikel auf Codeproject (1. Link). Das dürfte schon ziemlich das sein, was du suchst.
 
Das hilft mir leider nicht sehr viel weiter,
ich komme mit dieser Klasse einfach nicht klar, und die dabei entstehende Videoqualitat ist sehr schlecht.

Gibt es nicht einfach schon eine fertige Anwendungserweiterung, mit der ich die Frames in eine Videodatei schreiben kann? :D

MfG
Techno120 ;)
 
Techno120 schrieb:
Gibt es nicht einfach schon eine fertige Anwendungserweiterung, mit der ich die Frames in eine Videodatei schreiben kann? :D

DirectShow, ffmpeg, MediaFoundation, und viele mehr. Aber was du in keinem finden wirst sind API Calls wie

Code:
UltraHDVideo video = new UltraHDVideo( @"D:\myvideo.avi" );
video.AddFrame( frame );

Wenn du nicht gewillt bist dich mit Dokumentationen auseinanderzusetzen, wirst du leider nicht sehr weit kommen...
 
Code:
UltraHDVideo video = new UltraHDVideo( @"D:\myvideo.avi" );
video.AddFrame( frame );

So habe ich mir das aber auch nicht vorgestellt :D
Danke nocheinmal, ich habe im Internet noch eine andere AVI Klasse gefunden, und werde diese dann mal ausprobieren. :)

MfG
Techno120
 
Danke, aber das mit dem Video erstellen habe ich hinbekommen.
Weißt du, wie mal von OpenGL oder DirectX Spielen ein Screenshot macht? :)
Ich habe dies schon mit einem Hook probiert, dieser bringt das Spiel nur zur aufhängen :D

Hast du eine Idee?

MfG
Techno120
 
Das geht nur über einen Hook.


Ich empfehle dir, ein einfacheres Projekt zu suchen. Gerade Bildverarbeitung ist recht ressourcenintensiv und wenn ich mir deine Fragen ansehe, dann weißt du bei weitem nicht genug, um das effizient genug über die Runden zu bekommen. Schon die kleine HD-Auflösung benötigt unkomprimiert ~60 MB/s Bandbreite (1280px*720px*24b*24Hz), unkomprimiertes FullHD benötigt ~142 MB/s, da muss man optimieren. Diese Datenmengen kann man nicht ohne Plan durch die Gegend kopieren und verarbeiten (GPU <-> RAM <-> HDD), ohne den Rechner in irgendeiner Form ins Stocken zu bringen. Und ich bezweifle, dass du das, ohne das System in die Knie zu zwingen, schaffst.
 
@e-Laurin...

hab grad deinen Beitrag gelesen und irgendwie etwas neugierig geworden (verstehs nämlich nich so ganz :P ).

1. Frage:
Wieso/Woher nimmst du 24 Hz? Das mit Bildbreite, Bildhöhe und Bittiefe da komme ich noch mit, aber wieso/woher 24 Hz?

2. Frage:
Wie genau berechnest du dann die MB/s? Also ich mein welche Einheit kommt den bei der "Breite * Höhe * Tiefe * Hertz" Formel rauß und wie bekommst du da dann die MB/s heraus?


Sorry. Aber bin, in diesem Bereich zumindestens, noch nicht so bewandert. Daher auch die Fragen ;)
 
Delacroix schrieb:
@e-Laurin...

hab grad deinen Beitrag gelesen und irgendwie etwas neugierig geworden (verstehs nämlich nich so ganz :P ).

1. Frage:
Wieso/Woher nimmst du 24 Hz? Das mit Bildbreite, Bildhöhe und Bittiefe da komme ich noch mit, aber wieso/woher 24 Hz?

2. Frage:
Wie genau berechnest du dann die MB/s? Also ich mein welche Einheit kommt den bei der "Breite * Höhe * Tiefe * Hertz" Formel rauß und wie bekommst du da dann die MB/s heraus?


Sorry. Aber bin, in diesem Bereich zumindestens, noch nicht so bewandert. Daher auch die Fragen ;)

1. 24 Bilder / s
2. 1280*720*3B*24/s = 63,3MB/s

;)
 
@Delacroix
Das ist genau das, was ich meine. Du bemerkst jetzt sicher selber, warum dein Projekt wahrscheinlich scheitern wird. Ich traue mir auch nicht zu, etwas a la Fraps zu programmieren. Da wird mit so vielen Tricks und Insiderwissen gearbeitet, da komme ich auch die nächsten 5 Jahre nicht hinterher. ;)

Wegen der Rechnung:
24 Hz, 24 fps bzw. 24 Bilder/Sekunde ist bei Filmen recht gängig. 15 fps wird bei Internetfilmen auch gerne genommen, aber da sieht man gerne mal Ruckeln bei schnellen Kamerafahrten oder Action.
Ansonsten wäre da noch 1.280 x 720 = 921.600 Pixel für ein ganzes Frame.
Pro Pixel 24 Bits Farben (RGB je 8 Bit) multipliziert mit der Anzahl an Pixeln und dann weißt du, wie viel Speicherplatz ein Frame benötigt. Und das dann 24 Mal pro Sekunde.

Deswegen hat man auch MMX und SSE (siehe auch SIMD) entwickelt. Diese Befehlssätze wurden gerade wegen den Datenmengen im A/V-Bereich entwickelt. Erst dadurch wurden CPUs damals schnell genug, auch höher aufgelöste Videos abspielen zu können.
 
Ich hab zwar bereits auf fps getippt gehabt, aber war mir doch etwas unsicher (da du ja Hz geschrieben hattest) :D

Danke für die Erklärung, das hat mich nämlich durchaus interessiert, aber es ist nicht mein Projekt ;)
Hatte die Fragen nur gepostet weil ich zufällig deinen Beitrag gesehen hab und naja... man will ja möglichst viel lernen ;) :D

PS: naja... aber ich kann mir dennoch nicht vorstellen, dass es so schwer sein soll ein Programm zu schreiben dass mir meinen Desktop recordet.

Ich habe mal eine Fernwartung in C# geschrieben und natürlich hat es keine HD Auflösung, aber man kann dennoch alles wunderbar erkennen und bedienen.
Da werden genauso einfach Screenshots erstellt, verglichen, versendet. Bei einem Screencast-Programm stelle ich mir das ähnlich vor --> Screenshot erstellen, in Datei schreiben. Evtl halt noch mit einem Codec komprimieren (aber das wäre derzeit für mich zu Hoch, hab mich damit noch nie beschäftigt :D )

Bei einer Auflösung von 1280 x 1024 Pixel und (für den Screenshot selbst) hab ich eine Bittiefe von 16 Bits verwendet waren meine Screenshots "ca." 100 - 140 kb groß. Die Schrift gut erkennbar und die Farben stimmten zwar noch, aber selbstverständlich hat man da große Unterschiede gesehen wenn bei einem Bild zu viele Farben drankammen (vor allem bei Verläufen oder zu bunten Bildern).

Dennoch für z.B. Video-Tutorials sollte das doch reichen und sogar bei 150 kb * 24 fps -> 3,5 MB/s (unkomprimiert natürlich). Wenn man das ganze dann noch mit einem Video-Codec komprimieren würde... (doch an dieser Stelle wie gesagt, bin ich völlig überfragt :D )
 
Delacroix schrieb:
Dennoch für z.B. Video-Tutorials sollte das doch reichen und sogar bei 150 kb * 24 fps -> 3,5 MB/s (unkomprimiert natürlich). Wenn man das ganze dann noch mit einem Video-Codec komprimieren würde... (doch an dieser Stelle wie gesagt, bin ich völlig überfragt :D )
Was rechnest du da - 150 kb unkomprimiert? Ein 1280px * 1024px * 16 Bit (=2 Byte) unkomprimiertes Bild ist schon 2,5 MB groß. Mal 24 fps sind das exakt 60 MB.

Dein 150 KB, in 16 Bit codiertes, unkomprimiertes Bild, hätte Maße von 277px * 277px.
 
Hmm... ja du hast recht.
Sorry hab völlig unbedacht, dass die JPG Datei 150 kb groß ist und nicht die Daten selbst :D :D :D

Habs gerade nachgeguckt. Die Screenshots variieren natürlich von der Größe.
Je nachdem was grad aufm Bild zu sehen ist ;)
 
Zurück
Oben