Tag Archive for Video

Vlc für Videos in Spielen

Die letzten Tage hatte ich mal wieder einiges in der Firma zu knobeln. Für Videos in Spielen benutzen wir auf Windows Vlc, doch das Problem war, das die .NET Interop Bibliothek seit 2+ Jahren nicht mehr aktualisiert wurde und schon gar nicht mit der neuesten Vlc Version kompatibel ist. Mal wird das Video zu klein abgespielt, mal ist der Bildschirm komplett schwarz und manchmal öffnet sich ein extra Fenster, in welchem das Video abgespielt wird. Somit war es völlig unbrauchbar. Allerdings hatten wir bisher noch keine gute Alternative gefunden.

Doch dann hat sich ein netter kleiner Blogeintrag, von 2009 doch auch aktualisiert, gefunden. Dieser hat sich zum Ziel genommen gehabt, einen Kontrapunkt zu den vielen Outdated oder total überdimensionierten Bibliotheken zu setzten, indem er einfach nur einen Startpunkt zum eigenen kleinen Interop liefert.

Gesagt getan war in kurzer Zeit ein kleiner aber feiner Wrapper gebaut und alle Probleme haben sich in Nichts aufgelöst.

Fazit: Auch wenn man oft davor zurückschreckt, es lohnt sich oft auch mal das Rad neu zu erfinden um die beste Lösung zu erhalten. Gerade da Vlc nunmal nicht mit dem Gedanken der Spieleprogrammierung geschaffen wurde, ist es sinnvoll sich die Features herauszupicken, die man braucht.

Ein Großer Dank geht hier an Helyar.net für den wunderbaren Blogpost.

Part 1
Part 2

Ich hoffe es hilft, diese Lösung etwas mehr zu verbreiten und wenn ich Zeit finde, werde ich mal einen kleinen Interop speziell für Spiele in .NET erstellen und hier veröffentlichen.

Stay tuned.

Short: Videos für XNA konvertieren

Da wir in der Firma unseren kompletten Content automatisiert in die richtigen Formate, für die jeweiligen Platformen, konvertieren lassen, war ich auf der Suche nach einem passenden Tool für XNA Videos. Das Problem bei der Sache ist, dass XNA ganz spezielle Anforderungen für Video Content hat. Das Video muss als SinglePass WMV9 enkodiert sein, muss einen Audiokanal haben und darf keine variable Bitrate besitzen. Das sind schon einige Restriktionen.

Normalerweise ist das Konvertieren von Videos kein Problem, man öffnet einfach den Movie Maker oder ähnliche Programme und speichert das richtige Format. Da wir aber alles automatisiert machen, wurde die Suche schwieriger. Das Program musste entweder per Kommandozeile steuerbar sein oder man müsste eine Programmieranbindung haben. Und das ist schon das größte Problem. Klasse Programme wie ffmpeg haben WMV9 nicht integriert da Microsoft die Hand über das Format hält und es auch keine richtige Dokumentation darüber gibt.

Nach langer Suche hat sich dann aber doch eine Möglichkeit gefunden und das sogar direkt von Microsoft selbst. Das Program Expression Encoder liefert neben dem Program auch ein SDK für C# mit, womit man direkt im eigenen Program die Videos konvertieren kann und alle möglichen Einstellungen vornehmen kann. Und am besten ist, es kann WMV9.

Damit hat sich das Problem gelöst und für alle die ebenfalls davor stehen, hier einmal ein kleiner Codeschnipsel, wie man Videos für XNA enkodieren kann:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Job job = new Job();
MediaItem item = new MediaItem(SourceFilePath);
job.MediaItems.Add(item);
job.OutputDirectory = "C:\\";
job.CreateSubfolder = false;
 
item.OutputFormat.VideoProfile = new AdvancedVC1VideoProfile()
{
  Size = item.MainMediaFile.VideoStreams[0].VideoSize,
  Bitrate = new ConstantBitrate(1000),
};
 
item.OutputFormat.AudioProfile = new WmaAudioProfile()
{
  Channels = 2,
};
 
job.Encode();
Job job = new Job();
MediaItem item = new MediaItem(SourceFilePath);
job.MediaItems.Add(item);
job.OutputDirectory = "C:\\";
job.CreateSubfolder = false;

item.OutputFormat.VideoProfile = new AdvancedVC1VideoProfile()
{
  Size = item.MainMediaFile.VideoStreams[0].VideoSize,
  Bitrate = new ConstantBitrate(1000),
};

item.OutputFormat.AudioProfile = new WmaAudioProfile()
{
  Channels = 2,
};

job.Encode();

Und falls man noch als Zusatzinformation wissen möchte, wie lang das Video ist, oder aber auch andere Information, kann man das über das MediaItem machen:

1
float timeLength = (float)item.FileDuration.TotalSeconds;
float timeLength = (float)item.FileDuration.TotalSeconds;