Kann das Problem daran liegen, dass in der Struct Pointer sind?
Komisch ist ja, dass nur die Anfangs-Byte-Sequenz anders ist, obwohl sie doch eigentlich garnichts mit dem Inhalt zu tun hat.
Hat keine eine Idee?
Je nachdem wie du es willst:
StreamReader sr = new StreamReader("@'"+pfad+"'");
oder
StreamReader sr = new StreamReader("@\\'"+pfad+"'");
Das Backsplash-Zeichen muss maskiert werden!
Okay, ich habe immerhin nun herausgefunden, dass diese 17 Bytes immer folgendes Muster ergeben:
_A _B _C 02 10 _D _B _C 02 _E _F 00 00 _x _B _C 02
Von diesen 17 Bytes sind 6 also immer gleich, und zwei (_B und _C) wiederholen sich jeweils drei mal.
Es gibt also nur 10 variable Bytes. Woher kommen die also?
Hier nun nocheinmal zur Verdeutlichung die 17 Bytes, die meiner Ansicht nach nicht zur Structure gehören, bei sechsmaligen Abspeichern des Byte-Array-Attributs:
A9 A2 91 02 10 C0 A2 91 02 75 12 00 00 DE A2 91 02
1D 87 AE 02 10 34 87 AE 02 75 12 00 00 52 87 AE 02
B9 67 B0 02 10 D0 67 B0 02 32 18 00 00 EE 67 B0 02
D5 A0 B2 02 10 EC A0 B2 02 6D 25 00 00 0A A1 B2 02
31 DB B9 02 10 47 DB B9 02 E8 17 00 00 61 DB B9 02
3D DA 93 02 10 54 DA 93 02 75 12 00 00 72 DA 93 02
Eine schönen guten Tag.
Einige wissen vielleicht von euch, dass im Windows ASF-Container Meta-Daten von Videos, Musik etc vorhanden sind, die man allesamt über Interfaces auslesen kann, was auch wunderbar klappt.
Jetzt möchte ich aber das angezeigte Thumbnail eines Videos ändern. In den Metadaten des Videos ist das Thumbnail allerdings nicht als reines Byte[]-Array gespeichert, sonder so:
MSDN: WM_PICTURE
Lese ich das Attribut aus und nutze Marshal.PtrToStructure() kann ich mir alles vernünftig auslesen und auch das Bild abspeichern.
Speichere ich das Byte-Array, dass ich per GetAttribute() erhalte direkt in eine Datei und vergleiche diese mit der Datei, die ich erhalte, wenn ich dieses Byte-Array per Marshal.PtrToStructure() umwandle und jedes Attribut einzeln in der richten Reihenfolge wieder zurück als Byte[]-Array abspeichere, dann fehlen am Beginn der neuen Datei immer 17 Bytes.
Nur leider habe ich keine Ahnung, was das für Bytes sind, da sich diese jedesmal, wenn ich GetAttribute() aufrufe ändern. Die Metadaten ändern sich aber nicht.
Ansonsten stimmen alle andern Bytes der beiden Dateien komplett überein (sind ca. 17KB).
Versuche ich, aus dem neuen Byte-Array per PtrToStructure (zuvor per Marshal.Copy in den RAM gespeichert) ein WM_Picture zu machen, bekomme ich zwar keine Fehlermeldung, aber die Attribute haben keinen Vernünftige Inhalte mehr.
Speichere ich in das neue Byte-Array die ersten 17 Bytes des Ur-Arrays ab, habe ich zwei komplett identische Arrays.
Wandle ich nun das neue Byte-Array inkl. den 17 Bytes per Marshal.PtrToStructure() um, habe ich wieder ein valides WM_Picture.
Woher die 17 Bytes kommen und wieso diese sich nun permanent ändern weiß ich jetzt aber immer noch nicht. Ansonsten klappt aber so die Umwandlung Struct->Byte[].
Leider bringt mir das so nichts, wenn ich später eigene Thumbnails speichern möchte, bevor überhaupt eines in einem ASF-Container existiert hat.
Jetzt aber das Hauptproblem:
Starte ich meine Anwendung neu, erstelle einen Pointer auf das ausgelesene Byte-Array aus der Datei und rufe Marshal.PtrToStructure() auf, bekomme ich erneut kein gültiges WM_Picture.
Wieso das nicht?
Ich bin am verzweifeln, da ich schon seit Tagen versuche, das Problem lösen zu können.
Kann mir wirklich niemand helfen?
Oder wenn ich das Problem tatsächlich über die COM-Objekte lösen möchte: Wieso kann ich dann die Objekte nicht instanzieren?
Ich habe die DLL und die Eintragungen in der Registry. Trotzdem die Fehlermeldung
Guten Abend allerseits,
ich nutze DirectShowLib-2005 und lade meine TV-Aufnahme (Video: Windows Media Centers neue WTV-Format). Alles klappt super, nur leider kann ich die Audiosprache nicht wählen.
Unter Windows Media Center klappt alles wunderbar:
Stereo, DTS, Englisch (falls vorhanden), Französisch (falls vorhanden, wie zB bei Arte) sind auswählbar.
Doch wie kann ich das in meinem IBaseFilter (IStreamBufferSource) ändern?
Unter MSDN finde ich hier nichts, da das Format zu neu ist, aber es muss doch eine Möglichkeit geben, da das Problem so neu auch nicht ist (DVDs haben ja auch mehrere Audio-Spuren).
In den Anhang packe ich noch einen Screenshot, wie GraphStudio meine Aufnahme rendert. Der Film ist eine Aufnahme von Euronews und enthält an sich mindestens ein Duzend verschiederen Audio-Sprachen.
Irgendwie müsste ich doch nach dem ersten PBDA-Filter eine Art Audio-Selektor einfügen. Ach, wenn es soetwas doch nur gäbe.
Out-Pin 1 ist Audio, Out-Pin 2 ist Video.
Der Rest sind Untertitel, Teletext etc.
Vielen Dank schoneinmal für eure Antworten:
Edit:
Ich habe es auch schon mit dem DVRPlayer-Interface der ehiplayer.dll von MediaCenter versucht. Aber ich kann fast kein Interface der DLL laden, obwohl alle GUIDs in der Registry vorhanden sind.
System.Runtime.InteropServices.COMException: Die COM-Klassenfactory für die Komponente mit CLSID {96EFF869-1551-4C34-9AAB-D175FFCB06C0} konnte aufgrund des folgenden Fehlers nicht abgerufen werden: 80040154.
bei WTVPlayer.MainForm..ctor() in e:\Documents\SharpDevelop Projects\WTVPlayer\WTVPlayer\MainForm.cs:Zeile 38.
bei WTVPlayer.Program.Main(String[] args) in e:\Documents\SharpDevelop Projects\WTVPlayer\WTVPlayer\Program.cs:Zeile 27.
Hmm.
Ich habs gerade mit meinem Handy versucht, dafür habe ich dann meinen Server an Port 80 lauschen lassen.
Also wenn der Server an seiner lokalen IP an Port 80 lauscht, und der Client am selben Router hängt, dann geht es nicht. Ist der Client an einem anderen Router, oder was auch immer, wie mein Handy, dann gehts.
Das ist Mist.
Will ich also an meinem Rechner testen, muss ich mit den lokalen IPs testen >_<
Da habe ich stundenlang den Fehler gesucht und die Lösung in Xynratrons Kommentar gefuden 👍
BTW: Beim lokalen testen kann dir dein Router einen Strich durch die Rechnung machen, da bei einigen Modellen Pakete aus dem Internen Netz an die öffentliche Adresse des Routers nicht mehr korrekt zum internen Netz zurückgeliefert werden.
Hierzu habe ich eine Frage:
Ich versuche gerade eine Client/Server Application zu entwickeln.
Den Client sowohl auch den Server entwickle ich an einem einzelnen Computer - müsste ja auch gehen. Tut es auch, aber nur solange ich die lokale IP meines Computers übergebe.
Doch wenn ich nun jemanden anderen den Client schicke, welche IP muss er dann angeben? Die des Routers?
Muss ich dann dem Server die lokale IP geben
TcpListener tl = new TcpListener(new IPEndPoint("128.x.x.x", 81));
nnd beim Client dann die Router-IP des Servers
TcpListener tl = new TcpListener(new IPEndPoint("77.x.x.x", 81));
?
Der Port wird weitergeleitet.
Probiere ich das jetzt an einem Recher (also der Server hat die lokale IP und der Client die Router-IP), dann bekomme ich diese schöne Fehlermeldung:
Ausnahme System.Net.Sockets.SocketException wurde im ausgeführten Programm ausgelöst:
Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte .
Liegt das jetzt nur daran, weil ich von lokal auf die Router-IP Adresse zugreife, so wie du das oben beschrieben hast?
Oder mache ich was falsch?
try
{
ServiceController sc = new ServiceController("universal bda receiver service");
if(sc.Status != ServiceControllerStatus.Stopped)
{
sc.Stop();
sc.WaitForStatus(ServiceControllerStatus.Stopped);
}
}
catch(Exception e)
{
System.IO.FileStream ts = System.IO.File.Create("D:\\Documents\\SharpDevelop Projects\\Standby Vista - Service\\Standby Vista - Service\\bin\\Debug\\Mistake.txt");
System.IO.StreamWriter sw = new System.IO.StreamWriter(ts);
sw.WriteLine(e.ToString());
sw.Close();
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="TRUE"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
Und ich bekomme immer folgendes in die die Mistake.txt
System.InvalidOperationException: Der Dienst UniversalBDASvc kann nicht auf dem Computer . geöffnet werden. ---> System.ComponentModel.Win32Exception: Zugriff verweigert
--- Ende der internen Ausnahmestapelüberwachung ---
bei System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess)
bei System.ServiceProcess.ServiceController.Stop()
bei Standby_Vista___Service.Standby_Vista___Service.UDRReset() in d:\Documents\SharpDevelop Projects\Standby Vista - Service\Standby Vista - Service\Standby Vista - Service.cs:Zeile 67.
Wo liegt denn der Fehler? X(
Irgendjemand muss doch eine Antwort wissen 🙁