Heute gibt es mal wieder ein bisschen C# Code. Es geht darum, wie man Videodatein in C# aus einzelnen Bildern bzw. Bitmaps erstellen kann. Mittels der AForge Library, welche ich schon in dem C# Webcam Tutorial verwendet habe, geht dies relativ einfach.
Vorbereitungen
Für das nachfolgende Tutorial braucht ihr die AForge.Video.FFMPEG.dll Library und die dazugehörigen FFMPEG Librarys. Alles beides findet ihr unter folgendem Link. Wählt auf der nachfolgenden Downloadseite die .zip-Datei aus, welche “(libs only)” im Dateinamen hat.
Im nächsten Schritt öffnet ihr euer Visual Studio oder eine Alternative Entwcklungsumgebung mit der ihr eurer Programm schreiben wollt. (Für das nachfolgende Tutorial beziehe ich mich auf as Visual Studio.)
Projekt erstellen
Legt nun ein neues Projekt, ich habe mich für ein WinForms-Projekt entschieden, und wartet bis das Visual Studio das Projekt erstellt hat. Entpackt nun das zuvor heruntergeladene AForge-Paket. In dem Ordner Release des Archivs findet ihr sämtliche AForge Librarys. Für dieses Tutorial benötigen wir jedoch nur die AForge.Video.FFMPEG Library. Kopiert diese in den Ordner eures Visual Studio Projekts. Fügt nun eine Referenz in eurem Projekt auf die AForge.Video.FFMPEG Library hinzu. (Wer nicht weiß, wie man Referenzen hinzufügt, kann dies hier nachlesen.)
Bevor wir weitermachen können, müssen noch zwei weitere Einstellungen an eurem Projekt vorgenommen werden. Zum einen muss gegebenenfalls die Zielversion .NET-Framework angepasst werden. Diese darf maximal 3.5 betragen, da die AForge-Library nicht mit neuren Version (4.0, 4.5) kompatibel ist. Dies geht in den Properties eures Projekts. (Siehe Screenshot, links)
Im zweiten Schritt müsst ihr ggf. die Zielarchitektur eures Projektes umstellen. Standardmäßig dürfe diese auf “Any CPU” stehen. Hier müsst ihr explizit x86 angeben. Diese Einstellung könnt ihr ebenfalls über die Properties eures Projekts vornehmen. (Siehe Screenshot, rechts)
Kurzer Zwischenstand – ihr solltet nun ein Projekt angelegt haben, eine Referenz auf die AForge.Video.FFMPEG-Library hinzugefügt haben, die Zielplattform auf x86 und das Zielframework auf höchsten 3.5 eingestellt haben. Wenn dem so ist, kann es weitergehen.
Im nächsten Schritt brauchen wir noch ein paar weitere Dlls aus dem AForge Archiv. Ihr findet diese im AForge Archiv in dem Ordner “Externals\ffmpeg”. Alle Dateien aus diesem Ordner müsst ihr in den Ausgabeorder eures Visual Studio Projekts kopieren. (Dies müsste nach Umstellung der Zielplattform nun “EuerProjektOrdner\bin\x86\Debug” sein.)Codebasis schaffen
Wenn ihr das nun auch erledigt habt, kann es mit dem Code losgehen. Als erstes solltet ihr die AForge Library per using-Direktive einbinden.
using AForge.Video.FFMPEG;
Im nächsten Schritt legen wir eine Methode an, in der den Code zur Videoerstellung in C# schreiben wollen. Ich habe hierfür einen Button auf der Form der Anwendung angelegt und werde nachfolgend dessen Button-Click-Methode verwenden.
private void buttonCreateVideo_Click(object sender, EventArgs e) { }
VideoFileWriter erstellen
Hinweis: Der nun folgende Code gehört ausschließlich in diese Methode. Ich werden den Code Stück für Stück aufbauen und erklären. Wer nur nach der Lösung sucht, sollte nun einfach ganz an das Ende des Artikel scrollen.
Als erstes legen wir zwei Variablen für die Breite und Höhe des Videos an. Hiermit geben wir die Auflösung des Videos an. Danach erstellen wir eine Instanz des VideoFileWriters und öffnen eine neue Videodatei mittels dessen open()-Methode.
int width = 640; int height = 480; VideoFileWriter writer = new VideoFileWriter(); writer.Open("code-bude_test_video.avi", width, height, 25, VideoCodec.MPEG4, 1000000);
Noch eine kurze Erklärung der open()-Methode. Der vierte Parameter gibt die Frames/Sekunde des Videos an, der fünfte den Codec und der sechste die Bitrate des Videos in Bit! Die hier angegebene Rate von 1000000 entspricht einer Videobitrate von 1 Mbit. Je höher die Bitrate, umso größer die Video und umso besser die Qualität.
Videoframes erstellen und schreiben
Nun können wir beliebig viele Frames in form von Bitmap-Grafiken wegschreiben. Hierzu dient dient der nachfolgende Code. Der Modulo-Operator (%) sowie die Zufallszahlen dienen nur dazu, ein wenig Bewegung in unser Testvideo zu bekommen. Dank der Framerate von 25 FPS, die wir oben beim Öffnen des VideoFileWriters angegeben haben, wissen wir, dass 25 Grafiken 1 Sekunde Video ergeben. Da wir mit den nachfolgenden Schleifen 375 Grafiken erstellen bzw. wegschreiben, wird unser Video also 15 Sekunden lang.
Bitmap image = new Bitmap(width, height); Graphics g = Graphics.FromImage(image); g.FillRectangle(Brushes.Black, 0, 0, width, height); Brush[] brushList = new Brush[] { Brushes.Green, Brushes.Red, Brushes.Yellow, Brushes.Pink, Brushes.LimeGreen }; Random rnd = new Random(); for (int i = 0; i < 250; i++) { int rndTmp = rnd.Next(1, 3); Application.DoEvents(); g.FillRectangle(brushList[i%5], (i % width)*2, (i % height) * 0.5f, i%30, i%30); g.FillRectangle(brushList[i % 5], (i % width)*2, (i % height)*2, i % 30, i % 30); g.FillRectangle(brushList[i % 5], (i % width) * 0.5f, (i % height) *2, i % 30, i % 30); g.Save(); writer.WriteVideoFrame(image); } g.DrawString("(c) 2013 by code-bude.net", new System.Drawing.Font("Calibri", 30), Brushes.White, 80, 240); g.Save(); for (int i = 0; i < 125; i++) { writer.WriteVideoFrame(image); }
Video speichern
Im letzten Schritt müssen wir den VideoFileWriter noch schließen.
writer.Close();
Das war es auch schon. Die paar gezeigten Zeilen Code reichen vollkommen aus, um ein eigenes Video in C# zu erstellen.
Download & Codeübersicht
Nachfolgend gibt es noch einmal den komplette Code der Form1.cs-Datei, sowie einen Downloadlink zum Visual Studio Projekt.
Download: VideoFileWriter Beispiel Projekt
using AForge.Video.FFMPEG; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace VideoWriter { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void buttonCreateVideo_Click(object sender, EventArgs e) { int width = 640; int height = 480; VideoFileWriter writer = new VideoFileWriter(); writer.Open("code-bude_test_video.avi", width, height, 25, VideoCodec.MPEG4, 1000000); Bitmap image = new Bitmap(width, height); Graphics g = Graphics.FromImage(image); g.FillRectangle(Brushes.Black, 0, 0, width, height); Brush[] brushList = new Brush[] { Brushes.Green, Brushes.Red, Brushes.Yellow, Brushes.Pink, Brushes.LimeGreen }; Random rnd = new Random(); for (int i = 0; i < 250; i++) { int rndTmp = rnd.Next(1, 3); Application.DoEvents(); g.FillRectangle(brushList[i%5], (i % width)*2, (i % height) * 0.5f, i%30, i%30); g.FillRectangle(brushList[i % 5], (i % width)*2, (i % height)*2, i % 30, i % 30); g.FillRectangle(brushList[i % 5], (i % width) * 0.5f, (i % height) *2, i % 30, i % 30); g.Save(); writer.WriteVideoFrame(image); } g.DrawString("(c) 2013 by code-bude.net", new System.Drawing.Font("Calibri", 30), Brushes.White, 80, 240); g.Save(); for (int i = 0; i < 125; i++) { writer.WriteVideoFrame(image); } writer.Close(); } } }
Maybe in the future it’ll do even better in those areas, but for now it’s a fantastic way to organize and listen to your music and videos, and is without peer in that regard. The iPod’s strengths are its web browsing and apps.
Hat sich erledigt mir ist beim Kopieren ein Fehler unterlaufen was mir schon ein wenig peinlich ist der Fehler lag also bei mir mit ihren instruktionen stimmte alles
Guten Tag
Ich muss ihnen leider mitteilen das ich trotz der verwendung der angeführten einstellungen eine Fehlermeldung beim Ausführen erhalte es handelt sich um die gleiche Meldung wie auch schon herr Meier sie erhielt sollte es hierfür eine einfache lösung geben so bitte ich sie sie mit mir zu teilen
Michael
Hi Raffi,
wenn ich dein Programm ausführe, kommt bei mir, obwohl ich deine Voreinstellungen gemacht habe, immer folgende Fehlermeldung : “Ein Ausnahmefehler des Typs “System.IO.FileNotFoundException” ist in DesktopWatcher.exe aufgetreten.
Zusätzliche Informationen: Das angegebene Modul wurde nicht gefunden. (Ausnahme von HRESULT: 0x8007007E)”
könntest du mir bitte helfen, da ich diese Möglichkeiten mit dem Video sehr interessant finde.
Peter