| Autor |
Beitrag |
BFK
      
Beiträge: 26
|
Verfasst: Sa 17.01.09 15:08
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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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):
dotnet-snippets.de/d...re-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 
      
Beiträge: 26
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 26
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 26
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 26
|
Verfasst: 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
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: So 18.01.09 18:35
jaenicke hat folgendes geschrieben : | | 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" "Q:\\video.avi" |
Jürgen
Zum Thema selbst kann ich aber nichts sagen.
|
|
BFK 
      
Beiträge: 26
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: So 18.01.09 20:38
Wenn der Compiler sich schon beim Einbetten der Ressource aufhängt, wird dir ein anderer Player wenig bringen  . Zur Fehlermeldung kann ich aber auch nichts sagen.
_________________ >λ=
|
|
BFK 
      
Beiträge: 26
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 26
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 19.01.09 00:08
BFK hat folgendes geschrieben : | | 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 
      
Beiträge: 26
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 26
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 19.01.09 01:40
BFK hat folgendes geschrieben : | 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 Kha und wie du ihn verwendet hast ( Video myvid = new Video(GetTempFileFromBytes(MyNamespace.Properties.Resources.video));) eigentlich nichts drin gewesen.
BFK hat folgendes geschrieben : | | (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.
BFK hat folgendes geschrieben : | 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.
|
|
|