Entwickler-Ecke

WinForms - Video-Datei (avi) in exe einbinden...aber wie zugreifen..?


BFK - Sa 17.01.09 15:08
Titel: Video-Datei (avi) in exe einbinden...aber wie zugreifen..?
Hallo an alle,

Habe folgendes Problem:
Habe eine avi-Video-Datei als Resource in meinem prog miteingebunden.
Jetzt will ich auf dieser avi-Datei zugreifen.

Mein Code:

C#-Quelltext
1:
2:
3:
4:
using Microsoft.DirectX.AudioVideoPlayback;


Video myvid = new Video(videos.Properties.Resources.video);


wobei videos, mein namenspace ist und video (eigentlich video.avi) meine avi-Datei ist, die als Resource miteingebunden ist.

Der Compiler gibt folgenden Fehler für die zweite Zeile:

Quelltext
1:
Fehler CS1503: 1-Argument: kann nicht von "byte[]" in "string" konvertiert werden.                    


Woran liegt es..?
Wie kann ich den auf diese Datei denn zugreifen..?

Habe lange im net gesucht, doch bis jetzt keine brauchbare Antwort gefunden.

Bitte um Hilfe, danke schon im voraus..!


jaenicke - Sa 17.01.09 17:31

Die Ressource liegt als byte Array vor. Der Konstruktor erwartet aber einen Dateinamen. Ich sehe in dem Objekt keine Möglichkeit für das direkte Abspielen einer Ressource, du wirst also wohl nicht um das vorherige Auspacken herumkommen.

Zum Beispiel so (ist zwar VB .NET, aber ist ja egal):
http://dotnet-snippets.de/dns/vbnet-erstellt-aus-einem-bytearray-eine-temporaere-datei-SID597.aspx

In der Windows API kann man mit CreateFile und dem entsprechenden Parameter dafür sorgen, dass eine erstellte temporäre Datei auch dann automatisch gelöscht wird, wenn das Programm abstürzt. In .NET gibt es diese Möglichkeit wohl nicht, denn diese gibt es AFAIK eben (leider leider) wohl nur unter Windows.


BFK - So 18.01.09 14:55

Danke dir jaenicke für deine Antwort..!
Hast mich schon ein wenig weitergebracht..!
Also so wie ich das verstanden habe, ist der einzige Weg eine Tempfile zu errichten und da meine Resource zu speichern um sie somit zu extrahieren und danach weiterzubenutzen.

Dein Code ist ja wie du sagtest in VB und ich habe leider keine Ahnung von VB. (Bin ja auch Anfänger in C#)
Hab den Code mal übersetzt und folgendes ist dabei rausgekommen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
    public FileInfo GetTempFileFromBytes(string Filename, byte[] data)
    {
        System.IO.FileInfo tempFile = new System.IO.FileInfo(My.Computer.FileSystem.GetTempFileName);
        string tempPath = tempFile.DirectoryName;
        FileInfo fileInfo = new FileInfo(Path.Combine(tempPath,  Filename));
        using (System.IO.FileStream fileStream = new System.IO.FileStream(fileInfo.FullName, FileMode.Create, FileAccess.Write)) {
        byte[] b = (byte[])data;
        fileStream.Write(b, 0, b.Length);
        fileStream.Close();
    }
        return fileInfo;
     }


Leider verstehe ich den Code nicht so ganz.
In der ersten Zeile wird ja eine neue tempfile erstellt, muss ich in der Klammer meine Resource als Argument übergeben werden..?
Oder was ist My.Computer.FileSystem.GetTempFileName ..?
Würde mich freuen, wenn du mir das ein wenig erklären könntest, weil wie gesagt, bin noch anfänger..!


Kha - So 18.01.09 15:05

Der VB-Code ist, wie zu erwarten ;), nicht wirklich sinnvoll, ich würde es so machen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
public string GetTempFileFromBytes(byte[] data)
{
  string path = Path.GetTempFileName();
  using (Stream stream = File.OpenWrite(path))
    stream.Write(data, 0, data.Length);
  return path;
}


BFK - So 18.01.09 16:22

Ahhh ok, danke dir..!

So wie ich das verstanden hab kann ich jetzt doch einfach mit

C#-Quelltext
1:
Video myvid = new Video(GetTempFileFromBytes(MyNamespace.Properties.Resources.video));                    


auf die Resource zugreifen oder nicht..?

Habe das so versucht und da kommt die Fehlermeldung, dass nicht genügend Speicher verfügbar ist.


jaenicke - So 18.01.09 16:29

Wo kommt denn der Fehler? Direkt beim Aufruf von GetTempFileFromBytes? Vielleicht klappt es, wenn du direkt die Ressource bei stream.Write schreibst. Dann muss das Array nicht als Parameter übergeben werden.


BFK - So 18.01.09 16:56

Der Fehler kommt direkt beim compilen.

Quelltext
1:
schwerwiegender Fehler CS0013: Unerwarteter Fehler beim Schreiben der Metadaten in die Datei "Q:\videos\videos\obj\Debug\videos.exe" -- "Für diesen Vorgang ist nicht genügend Speicher verfügbar. ".                    


Meinst so:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
public string GetTempFileFromBytes()
        {
        string path = Path.GetTempFileName();
        using (Stream stream = File.OpenWrite(path))
        stream.Write(videos.Properties.Resources.video, 0, videos.Properties.Resources.video.Length);
        return path;
        }


und dann mit

C#-Quelltext
1:
Video myvid = new Video(GetTempFileFromBytes());                    

zugreifen..?

Kommt aber genau der selbe Fehler auf..!

Das komische ist, dass jetzt auch wenn ich keine Rescource benutze, also z.B. so:

C#-Quelltext
1:
Video myvid = new Video("Q:\\video.avi");                    


der gleiche Fehler mit dem nicht verfügbaren Speicher kommt.

Den Fehler macht er, seitdem ich meine video-file als Resource miteingebunden hab.
Wenn ich ein neus Projekt starte ohne eine Resource einzubinden, dann funkt. es einwandfrei.
Woran kann es liegen..?


jaenicke - So 18.01.09 17:17

Ach beim Kompilieren. Ich gehe einmal davon, dass die Festplatte nicht voll ist und die Pfadangaben richtig?
// EDIT:
Wobei der Festplattenplatz bei der direkten Dateiangabe ja auch nicht nötig ist.
Ist der doppelte Backslash so korrekt? Wäre nicht eher @"Q:\video.avi" richtig?

Dann bin ich überfragt. Dazu kenne ich C# zu wenig.


BFK - So 18.01.09 17:24

Naja Festplatta hat 1,3 GB frei, mein Video, das ich als Resource eingebunden habe ist 180 mb gross..!

Habe aber es auch in einer grösseren Partition mit über 30 gig Speicher frei ausprobiert und da kommt der selbe Fehler.

Nee, der doppelte ist ja korrekt, da ich das ja bei einem neuen Projekt ohne Resourcen erfolgreich getestet habe.

Trotzdem DANKE ich dir für deine Mühe und deine Zeit..!


JüTho - So 18.01.09 18:35

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ist der doppelte Backslash so korrekt? Wäre nicht eher @"Q:\video.avi" richtig?

Beides ist möglich:

C#-Quelltext
1:
2:
@"Q:\video.avi"   //  mit @ und normal geschrieben
"Q:\\video.avi"   //  ohne @ und doppelter Backslash

Jürgen

Zum Thema selbst kann ich aber nichts sagen.


BFK - So 18.01.09 20:36

Könnte ich eventuell keinen anderen Player benutzen, der direkt eine Resource als Argument mitgeliefert bekommt..?

Was gibt es denn noch für video-Players..?


Kha - So 18.01.09 20:38

Wenn der Compiler sich schon beim Einbetten der Ressource aufhängt, wird dir ein anderer Player wenig bringen :nixweiss: . Zur Fehlermeldung kann ich aber auch nichts sagen.


BFK - So 18.01.09 21:23

Vielleicht lag es doch am nicht verfügbaren Speicher, weil habe es grade mit ner recht kleineren Datei ausprobiert (nur 8 MB gross) und hier kommt der Fehlern nicht. Obwohl ich davor locker genügend Speicher hatte auch für meine 180 mb grosse avi-datei.

Naja, egal, jetzt kommt eine andere Fehlermeldung, und zwar eine nicht behandelte Exception, hier die Meldung:

Quelltext
1:
DirectXException wurde nicht behandelt                    


für die Zeile

C#-Quelltext
1:
Video myvid = new Video(GetTempFileFromBytes(videos.Properties.Resources.video));                    


Was habe ich denn nicht beachtet..?


Kha - So 18.01.09 23:11

Steht in der Exception auch noch Näheres drin (Message-Property)? Könnte aber sein, dass DX die Original-Endung erwartet, dann müsstest du doch wie im VB-Code mit Path.Combine einen eigenen Dateipfad bauen.


BFK - So 18.01.09 23:29

Der Fehler:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Microsoft.DirectX.DirectXException wurde nicht behandelt.
  Message="Fehler in der Anwendung."
  Source="Microsoft.DirectX.AudioVideoPlayback"
  ErrorCode=-2147467262
  ErrorString="E_NOINTERFACE"
  StackTrace:
       bei Microsoft.DirectX.AudioVideoPlayback.Video.Open(String fileName, Boolean autoRun)
       bei Microsoft.DirectX.AudioVideoPlayback.Video..ctor(String fileName)
       bei video1.Form1.Form1_Load(Object sender, EventArgs e) in C:\Dokumente und Einstellungen\BFK\Eigene Dateien\Visual Studio 2008\Projects\video1\video1\Form1.cs:Zeile 45.
       bei System.Windows.Forms.Form.OnLoad(EventArgs e)
       bei System.Windows.Forms.Form.OnCreateControl()
       bei System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
 .
 .
 .

Was meinst du mit original-Endung..?


jaenicke - Mo 19.01.09 00:08

user profile iconBFK hat folgendes geschrieben Zum zitierten Posting springen:
Was meinst du mit original-Endung..?
Die Funktion GetTempFileName gibt dir eine Datei mit der Endung .tmp oder so zurück.
Im VB Code wird der Temp-Pfad benutzt, aber mit dem übergebenen Dateinamen bzw. vor allem der richtigen Erweiterung (.avi) kombiniert.

Da unter Windows im Allgemeinen die Dateitypen an der Endung erkannt werden, wird vermutlich einfach nicht das Video als korrektes Videoformat erkannt bzw. nicht der Typ des Videos korrekt ermittelt, wenn du nicht eine Datei mit .avi als Dateierweiterung übergibst.


BFK - Mo 19.01.09 00:27

Ahh ok, danke für deine ausführliche und sehr aufklärliche Antwort.
Also in meinem Fall, bringt mir sowas:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
public string GetTempFileFromBytes(byte[] data)
        {
            string path = Path.GetTempFileName();
            using (Stream stream = File.OpenWrite(path))
            stream.Write(data, 0, data.Length);
            path = Path.Combine(path,".avi");
            return path;
        }

weil mir ja nur das .avi fehlt..!
Ist

C#-Quelltext
1:
path = Path.Combine(path,".avi");                    

richtiger Gedanke oder nicht..?
Weil so kommt derselbe Fehler raus..!


jaenicke - Mo 19.01.09 00:34

Kommt die Datei denn korrekt an? Also hast du einmal im temporären Verzeichnis nachgeschaut?
Stimmt der Pfad mit dem im Programm überein? Also lass dir den einmal ausgeben und schaue nach ob die Datei an der Stelle existiert.

Lässt sich die Datei dort korrekt abspielen? (Denn gelöscht wird die ja mit dem bisherigen Code nicht wieder, müsste also noch vorhanden sein.)

Wenn ja, was passiert, wenn du diesen Pfad direkt im Code angibst?


BFK - Mo 19.01.09 01:33

Also wenn ich nach den Pfad der Temp-Datei nachfrage, dann kommt:
C:\Dokumente und Einstellungen\BFK\Lokale Einstellungen\Temp\tmp1B0.tmp\video.avi
Wenn ich jetzt in diesem Ordner nachgucke, gibt es eine Datei namens "tmp1B0.tmp", kann die allerdings nicht öffnen, also nicht testen ob das video da funkt.(ist ja ne tmp-datei, kein ahnung wie man die öffnent wenn es überhaupt geht)

Wenn ich den Pfad direkt als Argument im Video übergebe, also so:

C#-Quelltext
1:
Video myvid = new Video("C:\\Dokumente und Einstellungen\\BFK\\Lokale Einstellungen\\Temp\\tmp1B0.tmp\\video.avi");                    

dann kommt genau derselbe Fehler raus, also die DirectXException..!


jaenicke - Mo 19.01.09 01:40

user profile iconBFK hat folgendes geschrieben Zum zitierten Posting springen:
Also wenn ich nach den Pfad der Temp-Datei nachfrage, dann kommt:
C:\Dokumente und Einstellungen\BFK\Lokale Einstellungen\Temp\tmp1B0.tmp\video.avi
Wenn ich jetzt in diesem Ordner nachgucke, gibt es eine Datei namens "tmp1B0.tmp", kann die allerdings nicht öffnen, also nicht testen ob das video da funkt.
Fällt dir nicht selbst etwas auf? ;-)
Woher kommt das video.avi am Ende? Davon ist in dem Quelltext von user profile iconKha und wie du ihn verwendet hast (Video myvid = new Video(GetTempFileFromBytes(MyNamespace.Properties.Resources.video));) eigentlich nichts drin gewesen. :gruebel:

user profile iconBFK hat folgendes geschrieben Zum zitierten Posting springen:
(ist ja ne tmp-datei, kein ahnung wie man die öffnent wenn es überhaupt geht)
Umbenennen bzw. diese mit einem MediaPlayer öffnen, der Windows Media Player z.B. versucht den Dateiinhalt dann an Hand des Inhalts zu erkennen.

user profile iconBFK hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich den Pfad direkt als Argument im Video übergebe, also so:

C#-Quelltext
1:
Video myvid = new Video("C:\\Dokumente und Einstellungen\\BFK\\Lokale Einstellungen\\Temp\\tmp1B0.tmp\\video.avi");                    

dann kommt genau derselbe Fehler raus, also die DirectXException..!
Was ja auch kein Wunder ist...
Du hast doch gerade selbst geschrieben, dass dies gar nicht der richtige Dateiname und -pfad ist. Genau aus dem Grund hatte ich ja auch nachgefragt, ob der Pfad im temporären Verzeichnis mit dem im Programm überein stimmt. Und genau das ist ja deinen Worten zu Folge nicht der Fall.


BFK - Mo 19.01.09 02:06

Naja, das "video.avi" kommt weil ich vorher:

C#-Quelltext
1:
path = Path.Combine(path,"video.avi");                    

geschrieben habe, sorry, habe vergessen das zu sagen.

Wenn ich diese Zeile auslasse, dann kommt als Pfad ja nur das:

Quelltext
1:
C:\Dokumente und Einstellungen\BFK\Lokale Einstellungen\Temp\temp1B0.tmp                    

(Ok, diesmal war es zwar temp1C8.tmp, spielt ja aber keine Rolle.)
Und derselbe Fehler..!

Wenn ich diese tmp-Datei öffne, mit Windows Media (wie du sagtest) oder mit vlc player, dann wird das Video zwar abgespielt, aber ohne Bild, also nur Sound..!


jaenicke - Mo 19.01.09 02:09

user profile iconBFK hat folgendes geschrieben Zum zitierten Posting springen:
Naja, das "video.avi" kommt weil ich vorher:

C#-Quelltext
1:
path = Path.Combine(path,"video.avi");                    

geschrieben habe, sorry, habe vergessen das zu sagen.
Das musst du aber vor der Erzeugung des Streams machen, das ist dir hoffentlich klar?
Weil sonst erzeugst du die Datei mit dem ursprünglichen Namen und gibst den neuen Namen (einer nicht existierenden Datei) zurück...

Zudem würde es reichen .avi an den Dateinamen anzuhängen, dann sähe der so aus:
xy.tmp.avi

// EDIT:
Ich vermute auch, dass das Verzeichnis nicht automatisch erzeugt wird (denn der Dateiname .tmp wird ja mit deinem Path.Combine als Ordnername benutzt), deshalb ist das anhängen von .avi die sinnvollere Alternative.
Du kannst natürlich auch wie im VB Quelltext verfahren.


BFK - Mo 19.01.09 02:20

Habe das ja hier gemacht:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
public string GetTempFileFromBytes(byte[] data)
        {
            string path = Path.GetTempFileName();
            using (Stream stream = File.OpenWrite(path))
            stream.Write(data, 0, data.Length);
            path = Path.Combine(path,"video.avi");  // hier
            return path;
        }

und dann mit

C#-Quelltext
1:
Video myvid = new Video(GetTempFileFromBytes(video1.Properties.Resources.video));                    



user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:


Zudem würde es reichen .avi an den Dateinamen anzuhängen, dann sähe der so aus:
xy.tmp.avi

Hatte ich ja auch am Anfang so gemacht, nur kam da auch derselbe Fehler raus.

//Edit
Wenn ich .avi anhänge zeigt er mir dann folgenden Pfad:

C#-Quelltext
1:
C:\Dokumente und Einstellungen\BFK\Lokale Einstellungen\Temp\tmp1B0.tmp\.avi                    

Wie kann ich denn das "\" auslassen und wieso macht er überhaupt ein "\" ..?


jaenicke - Mo 19.01.09 02:21

Du hast ja auch genau das falsch gemacht, was ich eben geschrieben habe... :roll:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Das musst du aber vor der Erzeugung des Streams machen, das ist dir hoffentlich klar?
Weil sonst erzeugst du die Datei mit dem ursprünglichen Namen und gibst den neuen Namen (einer nicht existierenden Datei) zurück...


BFK - Mo 19.01.09 02:28

Sorry, könntest du mir das Bitte erklären, wie du das meinst..?

Weil nach meiner Logik nach setzte ich das ".avi" an meinem Pfad an und übergebe es doch danach an Video... .


jaenicke - Mo 19.01.09 02:46

user profile iconBFK hat folgendes geschrieben Zum zitierten Posting springen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
public string GetTempFileFromBytes(byte[] data)
        {
            string path = Path.GetTempFileName();
            using (Stream stream = File.OpenWrite(path))
            stream.Write(data, 0, data.Length);
            path = Path.Combine(path,"video.avi");  // hier
            return path;
        }
Dann schauen wir doch mal was du machst, Zeile für Zeile:
Ich fasse zusammen:
Du legst den Inhalt deiner Ressource in

Quelltext
1:
C:\Dokumente und Einstellungen\BFK\Lokale Einstellungen\Temp\tmp1B0.tmp                    

und gibst als Dateiname für die Datei zurück:

Quelltext
1:
C:\Dokumente und Einstellungen\BFK\Lokale Einstellungen\Temp\tmp1B0.tmp\video.avi                    

Klar? ;-)

Schreib doch stattdessen gleich am Anfang:

C#-Quelltext
1:
string path = Path.GetTempFileName() + ".avi";                    
(Und verändere danach path natürlich nicht mehr nach dem Schreiben der Datei.)

user profile iconBFK hat folgendes geschrieben Zum zitierten Posting springen:
//Edit
Wenn ich .avi anhänge zeigt er mir dann folgenden Pfad:

C#-Quelltext
1:
C:\Dokumente und Einstellungen\BFK\Lokale Einstellungen\Temp\tmp1B0.tmp\.avi                    

Wie kann ich denn das "\" auslassen und wieso macht er überhaupt ein "\" ..?
Das liegt am Path.Combine, genau das soll es ja machen. Wie wäre es, wenn du dir die Doku [http://msdn.microsoft.com/en-us/library/system.io.path.combine.aspx] anschaust? ;-)


BFK - Mo 19.01.09 03:14

Das erklären hast du aber wirklich drauf muss ich schon sagen.

Nun zu meinem Problem:
:? Leider kommt immernoch dieselbe Fehlermeldung..!
Nur diesmal erstellt er eine Datei im Temp die ne avi-Datei ist namens "tmpblabla.tmp.avi"..!
Beim abspielen wird auch wieder nur Sound abgespielt..!

Weiss nicht, was ich diesmal wieder falsch mache...???

Ahh und noch was nebenbei, wo hättest du eigentlich das Video denn definiert..?
Meine wo wäre denn für dich am logischten die folgende Zeile zu schreiben..?

C#-Quelltext
1:
Video myvid = new Video...                    


jaenicke - Mo 19.01.09 03:25

user profile iconBFK hat folgendes geschrieben Zum zitierten Posting springen:
:? Leider kommt immernoch dieselbe Fehlermeldung..!
Die Zeile mit

C#-Quelltext
1:
path = Path.Combine...                    
hast du gelöscht?

user profile iconBFK hat folgendes geschrieben Zum zitierten Posting springen:
Beim abspielen wird auch wieder nur Sound abgespielt..!
Hmm, da beide Dateien die gleiche Dateierweiterung haben, kann ich mir das gerade nicht erklären.

user profile iconBFK hat folgendes geschrieben Zum zitierten Posting springen:
Ahh und noch was nebenbei, wo hättest du eigentlich das Video denn definiert..?
Meine wo wäre denn für dich am logischten die folgende Zeile zu schreiben..?

C#-Quelltext
1:
Video myvid = new Video...                    
Ich habe selbst noch nicht allzuviel mit C# gemacht, eigentlich programmiere ich hauptsächlich in Delphi. Deshalb werde ich das ganze erst einmal ausprobieren. Dann kann ich dazu und zu dem Fehler vermutlich auch mehr sagen.

(Denn weder habe ich bisher mit Ressourcen noch mit Videos in C# gearbeitet. ;-))


BFK - Mo 19.01.09 03:28

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconBFK hat folgendes geschrieben Zum zitierten Posting springen:
:? Leider kommt immernoch dieselbe Fehlermeldung..!
Die Zeile mit

C#-Quelltext
1:
path = Path.Combine...                    
hast du gelöscht?



Ja die habe ich natürlich gelöscht..!


jaenicke - Mo 19.01.09 03:40

Davon war ich auch ausgegangen, aber ich hätte eine andere Fehlermeldung erwartet aufgrund der Änderung, deshalb habe ich noch einmal nachgefragt. ;-)

Leider ist die Dokumentation von Microsoft an der Stelle ziemlich dürftig. Ich bin dabei es selbst auszuprobieren, muss aber erst noch herausfinden wie ich das in Visual Studio genau umsetzen muss (z.B. was Ressourcen angeht). Aber das ist sicher nicht schwer. :D

Ich denke ich werde in ein paar Minuten so weit sein. ;-)


BFK - Mo 19.01.09 17:31

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Leider ist die Dokumentation von Microsoft an der Stelle ziemlich dürftig. Ich bin dabei es selbst auszuprobieren, muss aber erst noch herausfinden wie ich das in Visual Studio genau umsetzen muss (z.B. was Ressourcen angeht). Aber das ist sicher nicht schwer. :D


Ja MSDN ist in manchen Bereiche leider nicht so umfangsreich wie es sein sollte.

Hoffe du findest den Fehler und DANKE dir schon jetzt für deine Mühe und vor allem deiner kostbaren Zeit..!


jaenicke - Mo 19.01.09 17:55

Nachdem ich gestern beim Download des DirectX SDKs eingeschlafen bin (und es heute morgen vergessen hatte) :hair: habe ich es jetzt gerade eben getestet. Ich hatte keine Probleme, gleich der erste Versuch funktionierte. Und das auch ohne die Dateierweiterung auf .avi zu setzen.

Was noch nach der Erzeugung des Videos fehlte war das:

C#-Quelltext
1:
2:
            myvid.Owner = MyPanel;
            myvid.Play();
Aber ansonsten funktionierte die Videoeinbindung problemlos. :nixweiss:

Mein kompletter Quelltext (also praktisch nur Copy&Paste):

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
        public string GetTempFileFromBytes(byte[] data)
        {
            string path = Path.GetTempFileName();
            using (Stream stream = File.OpenWrite(path))
                stream.Write(data, 0, data.Length);
            return path;
        }
        
        private void button1_Click(object sender, EventArgs e)
        {
            Video myvid = new Video(GetTempFileFromBytes(Properties.Resources._N24_20090119_041008));
            myvid.Owner = MyPanel;
            myvid.Play();
        }

// EDIT:
Ach ja: Die Anzeige und auch der Sound waren normal.
// EDIT2:
Ich weiß nicht, ob das wichtig ist, aber ich habe einfach alle DLLs mit Microsoft.DirectX.* als Referenz hinzugefügt, nicht nur einzelne.


BFK - Mo 19.01.09 18:31

Komisch bei mir funkt es nicht..! :( :( :(

Mit "alle DLLs mit Microsoft.DirectX.* " meinst du doch die Verweise, die man im Ordner Verweise unter den Projektmappenexplorer hinzufügt, oder nicht..?

Weil da habe ich nur (von den DirectX) "Microsoft.DirectX" und "Microsoft.DirectX.AudioVideoPlayback", aber auch wenn ich andere Verweise da hinzufüge (wie z.B. DirectX.DirectPlay), funkt es nicht, also kommt immernoch der Fehler der Exception.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Was noch nach der Erzeugung des Videos fehlte war das:

C#-Quelltext
1:
2:
            myvid.Owner = MyPanel;
            myvid.Play();
Aber ansonsten funktionierte die Videoeinbindung problemlos. :nixweiss:

Die beiden Zeilen habe ich auch, ich habe eigentlich den genau gleichen Code wie du, nur dass sich dieser Abschnit:

C#-Quelltext
1:
2:
3:
Video myvid = new Video(GetTempFileFromBytes(Properties.Resources._N24_20090119_041008));
            myvid.Owner = MyPanel;
            myvid.Play();

in der Funktion Form1_Load befindet und nicht in button1_click, ist ja eigentlich in diesem Fall doch egal..!

Könnte es sein, dass ich mein Video nicht richtig als resource gespeichert habe..???
Aber dann hätte doch eigentlich schon bei dieser Zeile:

C#-Quelltext
1:
Mynamespace.Properties.Resources.video                    

einen Fehler geben müssen, oder nicht..???


jaenicke - Mo 19.01.09 20:46

Ich werde einfach mal ein komplettes Projekt hochladen, inkl. Testvideo. Das muss ich aber erst vorbereiten, es soll ja auch nicht unnötig groß sein, aber sehen und hören muss man ja trotzdem was.

user profile iconBFK hat folgendes geschrieben Zum zitierten Posting springen:
Könnte es sein, dass ich mein Video nicht richtig als resource gespeichert habe..???
Aber dann hätte doch eigentlich schon bei dieser Zeile:

C#-Quelltext
1:
Mynamespace.Properties.Resources.video                    

einen Fehler geben müssen, oder nicht..???
Würde ich auch denken, ja.


BFK - Di 20.01.09 14:01

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ich werde einfach mal ein komplettes Projekt hochladen, inkl. Testvideo. Das muss ich aber erst vorbereiten, es soll ja auch nicht unnötig groß sein, aber sehen und hören muss man ja trotzdem was.



Ahh ok, dann warte ich mal einfach ab.
Bin wirklich gespannt, woran es liegt..!


BFK - Mi 21.01.09 17:34

Hätte nur noch eine Frage.
Da es bei mir aus irgendeinen Grund nicht klappt, (habe es mittlerweile auch aufm zweiten Rechner getestet) wollte ich mal Fragen, gibt es noch einen anderen Player, ausser den DirectX, womit ich video Dateien abspilen kann...?
Und wenn ja, welcher..?

MFG BFK..!


jaenicke - Mi 21.01.09 18:00

Also ich habe jetzt schnell eine Demo mit einer .avi Datei angehängt. Ich hatte es vergessen. :oops:
Alles dabei was im Projektordner war, inkl. kompilierter Exe.


BFK - Mi 21.01.09 18:39

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Also ich habe jetzt schnell eine Demo mit einer .avi Datei angehängt. Ich hatte es vergessen. :oops:
Alles dabei was im Projektordner war, inkl. kompilierter Exe.



Also habe jetzt dein Projekt mal getestet und leider kommt bei mir wieder der gleiche Fehler, nur diesmal wo anders und zwar bei "program.cs" in der Zeile:

C#-Quelltext
1:
Application.Run(new Form1());                    


Habe zwei bilder miteingehängt, damit du es selbst sehen kannst und vielleicht daraus deine Entschlüsse ziehen kannst.

Der Fehler im Bild 1(der ist grad unwichtig, ist doch wegen der projektverschiebung..!) taucht auf sobald ich auf "button1" drücke. Dann kommt die unbehandelte DirectXException (Bild 2)..!


jaenicke - Mi 21.01.09 18:48

Was passiert denn, wenn du ohne zu kompilieren oder irgendetwas nur die exe im Bin\Debug Verzeichnis von mir ausführst. Achte darauf, dass es wirklich die aus der Zip-Datei ist.
Das ist ja vor allem interessant, weil das ja bereits fertig kompiliert ist. D.h. wenn da der Fehler auftritt, verrät das schon einiges. Dann liegt es an etwas auf deinem PC. Allerdings hätte ich, wenn es so ist, im Moment nicht viele Ideen mehr, könnte aber versuchen das auf anderen PCs selbst zu testen um einen zu finden, wo das auch auftritt.


BFK - Mi 21.01.09 18:59

Ok habe es direkt von der exe-gestartet und der Fehler taucht wieder auf, diesmal anders. (Siehe Bild im Anhang).
Hab es dann auch auf meinem zweiten Rechner getestet, wo auch der gleiche Fehler kommt.
Hab es dann per Skype an nem Kumpel geschickt, also nur die exe, und bei ihm läuft es normal. Er meint es bewegt sich ein Pfeil und so, es kommte also keine Fehlermeldung...!

Das Problem ist wirklich nur bei mir und komischerweise bei beiden Pcs..!


jaenicke - Mi 21.01.09 19:19

Sowas dachte ich mir schon...

Ich werde das im Hinterkopf behalten, aber ob ich da noch was finde... Vielleicht kann dir im MSDN Forum [http://forums.microsoft.com/msdn/default.aspx?siteid=1] (das ist ja von Microsoft) jemand helfen.


BFK - Mi 21.01.09 19:23

OK DANKE dir auf jeden Fall für alles..!

Gruss BFK..!

edit:
Ahh noch ne kleine Frage, kennst du vieleicht nen anderen Player als Ersatz für den DirectX..?


jaenicke - Mi 21.01.09 19:30

Welche Versionen von Windows, DirectX usw. hast du eigentlich im Moment installiert? (Start --> Ausführen --> dxdiag)

user profile iconBFK hat folgendes geschrieben Zum zitierten Posting springen:
Ahh noch ne kleine Frage, kennst du vieleicht nen anderen Player als Ersatz für den DirectX..?
Ich habe keine Ahnung, ob das damit geht, aber ich vermute es:
http://csgl.sourceforge.net/

Und dann gibts da ja noch DirectShow, aber auch da weiß ich nichts über C# damit, ich habe nur auf die Schnelle das gesehen:
http://www.codeproject.com/KB/directx/directshowmediaplayer.aspx


BFK - Mi 21.01.09 19:47

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Welche Versionen von Windows, DirectX usw. hast du eigentlich im Moment installiert? (Start --> Ausführen --> dxdiag)



Habe Windows XP Professional (5.1, Build 2600)
Directx version 9.0c (4.09.0000.0904)

Weiss nicht ob das wichtig ist, aber unter DirectX-Dateien, wo die DirectX-dll abgebildet sind steht bei der d3d9d.dll "Die Datei d3d9d.dll ist eine Debugversion, die langsamer ist als die Verkaufsversion.".

Meinst du es bringt vielleicht was DirectX zu de-und wieder installiern..?
Mit dem Abspielen von Videos hatte ich bis jetzt kein Problem..!


jaenicke - Mi 21.01.09 21:27

user profile iconBFK hat folgendes geschrieben Zum zitierten Posting springen:
Habe Windows XP Professional (5.1, Build 2600)
Directx version 9.0c (4.09.0000.0904)

Weiss nicht ob das wichtig ist, aber unter DirectX-Dateien, wo die DirectX-dll abgebildet sind steht bei der d3d9d.dll "Die Datei d3d9d.dll ist eine Debugversion, die langsamer ist als die Verkaufsversion.".
Du hast die neueste Version, das steht auf meinem Testsystem alles exakt genauso da. Da ist denen wohl eine falsche DLL hineingeraten. ;-)

Nach den installierten Versionen von .NET und so habe ich nicht gefragt, weil ich davon zu wenig Ahnung habe um damit etwas anfangen zu können. Irgendwo da wird wohl der Fehler liegen, aber leider kann ich dir bei solchen .NET Problemen nicht weiterhelfen.

Sollte ich es auf einem meiner PCs oder einem auf den ich Zugriff habe reproduzieren können, dann könnte ich da genauer schauen. Aber für eine Ferndiagnose bzw. für die Hilfe zur Fehlerbehebung fehlt mir mit .NET wie gesagt leider die Erfahrung.