Laden...

Bitmap per Remoting übertragen?

Erstellt von CaptainIglo vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.534 Views
C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 17 Jahren
Bitmap per Remoting übertragen?

Hi,

ich habe hier eine Remoting-Verbindung mit FilterLevel.Full gebastelt, welche prinzipiell auch funktioniert, aber wenn ich ein Bitmap übertragen will, bekomme ich folgende Exception, wenn ich das Bitmap verwenden will:

Das Feld nativeImage kann nicht in Typ System.Drawing.Image gefunden werden.

Was muss ich da ändern, damit das funktioniert?
Wenn ich das Bitmap in ein byte[] wandle und das übertrage und wieder zurückwandle geht es, aber das ist mir zu langsam (~100ms, brauche aber <40ms).

mfg
Capt.Iglo

6.862 Beiträge seit 2003
vor 17 Jahren

Was soll nativeImage auch für dein Feld sein? In der Bitmap oder Image Klasse ists nicht vorhanden. Ists vielelicht nen abgeleiteter Typ von dir das dieses Feld hat?

Baka wa shinanakya naoranai.

Mein XING Profil.

C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 17 Jahren

Nein, ist nichts abgeleitetes o.ä.
Die Exception kommt z.B. wenn ich bei meinem Panel, welches im Remote-Object liegt panel.BackGroundImage = new Bitmap("xxx.jpg"); ausführe, aber alle "normalen Properties" wie z.B. BackColor oder Size kann ich ändern und das Panel in der anderen Anwendung ändert sich auch entsprechent.
Auch wenn ich aus dem Bitmap ein byte[]-Array mache, das in den panel.Tag lege und es in der anderen Anwendung wieder rauslese, zurückwandle und dann als BackGroundImage setzte geht es.

I
256 Beiträge seit 2005
vor 17 Jahren

Probier mal

panel.BackGroundImage = (Image)(new Bitmap("xxx.jpg"));

C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 17 Jahren

Original von Ifoko
Probier mal

panel.BackGroundImage = (Image)(new Bitmap("xxx.jpg"));

Selbe Exception...

I
256 Beiträge seit 2005
vor 17 Jahren

Hmm, post mal etwas Code, dann kann ich dir vllt helfen.

komisch bei mir hat das Standard Panel gar kein BackgroundImage. wAs ist das für eine Klasse die Du da verwendest.

lg

3.728 Beiträge seit 2005
vor 17 Jahren

Original von CaptainIglo
Wenn ich das Bitmap in ein byte[] wandle und das übertrage und wieder zurückwandle geht es, aber das ist mir zu langsam (~100ms, brauche aber <40ms).

Genau das passiert aber beim Serialisieren des Bildes. Man kann nur serialisierbare Objekte (Also solche, die ISeralizable implementieren, von MarshalByValueComponent ableiten oder mit [Serializable]-versehen sind) über einen Remoting-Kanal übertragen. Image (und damit auch Bitmap) ist von MarshalByRefObject und demnach nicht serialisierbar. Wenn es serialisierbar wäre, würde es genauso lange dauern, wie die manuelle Umwandlung in byte[].

Du musst also entweder das bild stärker komprimieren, verkleinern oder den Aufruf asynchron laufen lassen, dass die GUI am Client nicht blockiert, solange das Bild gestreamt wird.

C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 17 Jahren

Das Problem ist nicht die Übertragungszeit sondern die gesamte Zeit die zum senden des Bildes benötigt wird und die wird durch eine zusätliche komprimierung sicher nicht schneller.
Die <40ms brauche ich, da ich mind. 25fps übertragen muss (Video).
Falls da jemand eine bessere Lösung hat, nehme ich diese auch gerne an...

3.728 Beiträge seit 2005
vor 17 Jahren
Remoting

Für Video-Streaming ist Remoting nicht ausgelegt. Remoting ist für entfernte Methodenaufrufe gebaut worden. Das Problem ist, dass Remoting nur ganze Nachrichten überträgt. Wenn Dein Bild z.B. 120 KB hat, steht es erst dann am Client zur verfügung, wenn alle 120 KB vollständig übertragen wurden. Natürlich ist die Remoting-Infrastruktur erweiterbar. Du könntest eigene Kanäle und eigene Formatter schreiben, die alles mit maximaler Performanz streamen. Das ist aber keine tiviale Aufgabe.

Video Streaming geht aber hervorragend mit WCF.

Oder ganz klassisch über die Windows Media Services (So wie es der Media Player tut). Ab Windows 2000 Server gibt es einen streaming Media Server, der sowas tut. Du könntest auch den MediaPlayer als Control einbinden und Deine Video darüber streamen. Dann musst Du fast gar nichts prorammieren.

C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 17 Jahren

Hast du da vielleicht ein paar Beispiele?
Muss der MeidaPlayer installiert sein, wenn ich das Streaming über diesen mache, denn dass möchte ich vermeiden?

Für das normale Videostreaming würde das gehen, ich muss aber auch das Bild bzw. den Ton einer TV-Karte übertragen und die Klasse, die ich gefunden habe um mir das TV-Bild auszugeben will ein Panel übergeben haben, in welche sie dann das Bild "malt".
Da dachte ich, dass ich einfach per Remoting das Panel im Remoteobject übergeben kann und das dann das Bild in der anderen Anwendung ausgegeben wird.

3.728 Beiträge seit 2005
vor 17 Jahren
Media Player

Der Media Player ist bei Windows 2000+ standardmäßig installiert (Es gibt natürlich auch leute, die den Media Player manuell "entfernen").

Es sollte also kein Problem sein, den Media Player zu verwenden.

Die TV-Karten Anwendung ist für eine lokale Anwendung konzipiert. Über Remoting wird das nicht zufriedenstellend funktionieren. Vor allem wird das Malen mit GDI+ allein schon zu langsam sein. Videos fallen in den Berich DirectX. Hast Du schon mal im Bereich "Grafik und Sound" hier im Forum nachgesehen? Dort findest Du auch Leute, die sich mit DirectX-Technologie auskennen.

Du könntest es noch mit WCF versuchen. Aber serialisiert muss dort genauso werden und die Netzwerkverbindung ist auch nicht schneller.