2009-07-11 3 views
1

Ich habe eine Sequenz von JPG-Bildern, die ich auf dem Bildschirm erfassen und rendern, um ein Video zu erstellen.Rendering einer Sequenz von Bildern in C#, um ein Video zu machen

Ich entpacke das Bild aus einem MemoryStream mit einem JpegBitmapDecoder und render es, indem Sie die Quelle auf ein Bild-Steuerelement festlegen. Das scheint in Ordnung zu sein, aber der Prozessor-Overhead ist ziemlich hoch. Die Bilder sind 1280x720, laufen mit 30fps und ich kann nur knapp mit meinem Computer mithalten (Dual Core 2.8Ghz). Das Laufen bei höheren Auflösungen bringt mich dazu, Frames wegzuwerfen. Ich würde gerne versuchen, die CPU-Auslastung zu senken.

Die meiste ausgegebene Zeit scheint in der Entschlüsselung zu sein (einfache Benchmarks der Decodierung allein auf meiner Maschine zeigen, dass ich über 40fps decodieren kann). Weiß jemand, ob es einen schnelleren Decoder gibt (DirectX? DirectShow? Etwas kann ich auf die Grafikkarte auslagern?)

Wie beim Rendern scheint es nicht so, als wäre das Image Control für diese Art der Nutzung ausgelegt (Ich war wirklich überrascht, dass es überhaupt funktioniert hat, ich habe es einfach ausprobiert, weil es einfach war). Gibt es eine andere Möglichkeit, die einzelnen Frames schneller zu rendern?

+0

Eine alternative Lösung könnte sein, die jpg sequentiell zu benennen und dann die erste in VirtualDub zu öffnen, die sie dann als Video abspielen wird. –

+0

Ich hätte klarer sein sollen. Ich streame die Bilder und möchte ein Live-Video von den gestreamten Bildern abspielen. – Dolphin

+0

Welche Methode verwenden Sie, um die JPEG-Bilder zu streamen? Ich versuche fast genau dasselbe und verwende BinaryFormatter um den MemoryStream einzukapseln und zu senden. Ich frage mich, ob es eine bessere Methode gibt. – geometrikal

Antwort

1

Es klingt, als würden Sie das JPEG gleichzeitig dekodieren und skalieren. Die Größenanpassung kann auch teuer sein. Versuchen Sie, die Decodierung und die Größenänderung (unter Verwendung des billigsten verfügbaren Algorithmus) von den JPEGs zu trennen. Verwenden Sie etwas wie FreeImage mit "JPEG_FAST" zu dekomprimieren und "FILTER_BOX", um die Größe zu ändern.

Für die Anzeige ist TinyPTC einfach und schnell. (ein Wrapper um DirectDraw) Es ist C, aber es ist ziemlich einfach, einen Wrapper zu schreiben und auf eine DLL zu kompilieren, auf die Sie verweisen können.

+0

Größenanpassung ist nett, aber nicht notwendig, die meiste Zeit werde ich die native Auflösung verwenden. Ich muss FreeImage anschauen, um zu sehen, ob es schneller dekodiert. – Dolphin

+0

JPEG_FAST ist definitiv schneller (fast 50% schneller in meinem einfachen Benchmark), ich muss die Qualität am Montag überprüfen, um zu sehen, ob es akzeptabel ist. – Dolphin

Verwandte Themen