Laden...

Video Streaming mit c# realisieren

Erstellt von tom1502 vor 18 Jahren Letzter Beitrag vor 17 Jahren 6.374 Views
T
tom1502 Themenstarter:in
1 Beiträge seit 2006
vor 18 Jahren
Video Streaming mit c# realisieren

Hallo,

ich bin neu in C#(nicht in OOP), und möchte gerne eine Funktion zum Streaming von Videos realisieren. im Moment ist die Ausgabe noch uninteressant, da dies ein plugin für das OS-Projekt MediaPortal werden soll.

Ich bin mit den Theorien zu UDP und TCP vertraut(und realisierung in Java...), weis allerdings noch nicht welches Protokoll ich einsetzen soll.

Kann mir jemand gute Tutorials / HowTos und generelle Informationen zum Thema Streaming mit C# empfehlen?

Wäre für unterstützung dankbar!

MfG

Thomas

EDIT: Sollte vllt hinzufügen dass das ganze über LAN/WLAN laufen soll, nicht über ein WAN... video kommt in Mpeg2, bin im Moment aber nicht sicher!

C
366 Beiträge seit 2005
vor 17 Jahren

Ich sollte genau das selbe haben.
Weiß da niemand was?

6.862 Beiträge seit 2003
vor 17 Jahren

Ist zwar schon ein wenig älter das Projekt, aber hier WebTV1: Web-TV-Player, TV-Streams im Web dürftest du ein wenig Anregungen finden.

Baka wa shinanakya naoranai.

Mein XING Profil.

2.921 Beiträge seit 2005
vor 17 Jahren

@talla: Es ist zwar richtig, dass das Projekt schon etwas älter ist, aber momentan bin ich daran videostreaming per p2p-plugin zu realisieren. Der Grundstein ist schon gelegt. Es läuft.

Aber diese Versionen und Sachen, seit dem letzten Post, habe ich noch nie hier hereingestellt.

@die anderen beiden: 😉

Grundsätzlich ist das was mein Programm macht, schon laufende Streams abzufragen, ihr könnt aber auch natürlich eigene Streams übertragen oder sogar andere über euch weiterleiten.

Wichtig wäre dazu, dass ihr euch zum Beispiel über Sockets connected, wenn .NET das Protokoll nicht direkt unterstütz.

Eine einfach Möglichkeit könnt ihr ausprobieren, indem ihr einfach mal hingeht und z.B. von einem DVD-Stream einzelne Screenshots abspeichert.

Jetzt soll ein Benutzer versuchen, diese über TCP-IP zu empfangen.
Dazu hat er einen Receiver bzw. Client.

Der Streamer (bzw. Server) sendet die Bilder in einem bestimmten Abstand z.B.
(Intervall 10 sec.?)

Jetzt ist folgendes zu realisieren (programmiertechnisch):
Das Konzept gilt in diesem Falle für einen Livestream.

Der Server muss die Bild-Daten nehmen und per TCP-IP senden (egal, ob der Client da ist oder nicht, ist ja wie beim Fernsehen, das Programm läuft ja auch, wenn ihr nicht einschaltet). Am besten in einen Memorystream umwandeln, vielleicht sogar häppchenweise und diese komprimieren (aber erst in einem späteren Schritt).

Der Client empfängt jetzt. Vielleicht sendet ihr irgendwie noch eine Ende-Kennung.

Versucht das am Anfang mal mit kleinen Dateien.

Um zu empfangen UND darstellen zu können muss der Client die Stream-Daten wieder zurück in ein gültiges Format verwandeln. Sonst kann er ja nichts anzeigen.

Dazu habt ihr mehrere Möglichkeiten:

z.B. einfach den Puffer "roh" in eine PictureBox kopieren, oder umwandeln und dann selbst gucken, ob korrekt.

Also kurze Zusammenfassung:

Server
====

  • Lädt z.B. 10 Bilder (erstmal kleine Bilder verwenden).
  • Bild 1 nehmen (vielleicht auch anzeigen zur Selbstkontrolle) und senden
    Senden bedeutet hier entweder in MemStream umwandeln oder einfach die Bytes (so wie sie im Bild stehen) senden.
  • warten bis nächstes Timer-Event
  • nächstes Bild
  • alle Bilder durch?
  • wieder bei erstem bild anfangen zu senden

Sendet diese über TCP-IP nach aussen.

Der Client muss die Daten bekommen

Client
====

  • Versucht sich mit dem Server zu verbinden.
  • Wenn Verbindung steht, Daten holen und umwandeln.
  • Eventuell überprüfen.
  • Wenn nächste Daten kommen, wieder empfangen, umwandeln.
    usw.

Eigentlich ist hier schon das Loop für den Client fertig, denn wenn er nicht connected ist, muss er ja wieder versuchen sich mit dem Server zu verbinden.

Das wäre dann wohl die einfachste Möglichkeit.

Für einen kompletten Videostream ist dann ein Puffer zu verwenden.
Betrachtet diesen so, als wären die Bilder alle in diesen hineingeladen worden.
Jeder Teil des Puffers ist dann ein Abschnitt des Streams.

Durch Double-/Triple- oder Multibuffering sollte es dann möglich sein, während ein Teil empfangen wird einen anderen zu puffern. So könnt ihr auch euere Avis oder sonstiges übertragen. Was ihr wollt eben.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

3.971 Beiträge seit 2006
vor 17 Jahren

Ich würde aber bei Videos zum beispiel keine TCP Verbindung nutzen. Sonder UDP. Der Unterschied. UDP ist ein zustandsloses Protokoll. Heißt, dem Sender ist es egal wie die Daten drüben ankommen bzw. ob sie angekommen oder ein zwei Pakete auf der Strecke bleiben. TCP prüft hingegen, ob jedes einzelne Bit auch wirklich angekommen ist und das kostet Geschwindigkeit und Zeit. Im .NET müsste aber die Verwendung der UDPClient und -Listener Klasse genauso funktionieren.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

C
366 Beiträge seit 2005
vor 17 Jahren

Sehe ich das richtig, dass ihr das Video in Einzelbilder zerlegen würdet und diese sendet?

Ich hätte mir gedacht, das ich das VideoFile in ein (Netzwerk)Stream lade und der Client diesen abspielt.
Empfangen kann das mein Client schon, aber ich bekomme in nicht zum abspielen, da ich keine Klasse habe, welche Video aus einem Stream abspielt oder wenn ich den Stream in eine tmp-Datei schreibe, kann ich wärend dem schreiben nicht schon abspielen...

3.971 Beiträge seit 2006
vor 17 Jahren

Das würde bestimmt gehen. Einfach den Stream des Videos in den Stream deiner Networkstream zu schreiben und drüben wieder zusammen. Leider hast du dann Streaming a la Fernsehn, also du kannst nicht als Client zurückspulen, schneller, langsamer, anhalten usw.

Aber Streams sind doch Remoting fähig. lassen sich diese "komplexen" Gebilde über das Netzwerk komplett übertragen? Ohne Umwege über System.Net?

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

C
366 Beiträge seit 2005
vor 17 Jahren
  1. Zurückspulen o.ä. erledigt der Server also kein Problem.
  2. Wenn ich dem Client den vollen Filestream übergeben könnte, müsste auch dass funktionieren.
  3. Wieso Remoting, ist doch viel langsamer als TCP/UDP.
  4. Mein Problem ist nicht das übertragen des Streams sondern das Abspielen.
3.971 Beiträge seit 2006
vor 17 Jahren

Hab leider Remoting noch nicht ausprobiert, könnte mir halt nur vorstellen dass das geht bzw. gehn sollte. Deshalb hab ich auch keine Infos über Geschwindkeit

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

2.921 Beiträge seit 2005
vor 17 Jahren

Ob Ihr TCP oder UDP benutzt oder Sockets (dann könnt ihr komplett implementieren wie ihr wollt) ist ja völlig egal. Ich wollte euch ja nur einen Einstieg vermitteln auf dem ihr aufbauen könnt.

Ihr könnt natürlich auch den harten Weg gehen und gleich per P2P oder Multi-Buffering senden.

Ihr könntet auch genauso über spez. Commands Sequences vom Server anforderen (bzgl. der Frage mit vor- zurückspulen).

Dann müßt ihr euch halt eine Art Protokoll überlegen.

z.B. á la :

GET SEQ 1 TIMEINDEX 1

könnte z.B. für hole von der DVD VOB für Kapitel 1 bei Zeitindex 1 (1:00 Minuten).

z.Test für das Abspielen kannst du vorerst ja mal VLC (den Videolan-Player)benutzen.

Sende z.B. vom Server auf http://localhost:10000

gib dann im VLC diese Adresse und diesen Port sowie das entsprechende Protokoll an.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

C
366 Beiträge seit 2005
vor 17 Jahren

Ich glaube ihr habt mein aktuelles Problem noch nicht verstanden (oder ich habs noch nicht klar ausgedrückt):
Ich habe kein Problem mit dem Senden oder Empfangen (kann in allen Variationen Senden/Empfangen, wie z.B. Stream oder byte[]) aber ich kann es NICHT ABSPIELEN.
Alle Abspielvareanten die ich habe, wollen eine Datei als Quelle und ich habe aber nur ein byte[], Stream o.ä. und wenn ich diese Daten in eine Datei schreibe, kann ich diese zwar abspielen, aber nicht gleichzeitig schreiben (Zugriffsverweigerung), was ich aber müsste, da ja gleichzeitig empfangen und abgespielt wird.
Ich suche also eine Möglichkeit ein byte[] oder Stream mit Videodaten abzuspielen.
Bei den Audiodaten habe ich es z.B. mit byte[] + BASS.net gelöst, was TipTop funktioniert.

P.S.: Ein Kommunikationsprotokoll zwischen Server und Client, wo alles "ausgemacht" wird habe ich bereits (größtenteils) erstellt und funktioniert auch in den Teilen, wo es schon implementiert ist.

3.971 Beiträge seit 2006
vor 17 Jahren

und mit einem MemoryStream funktioniert das auch nicht? also einem Stream, der nur im Arbeitspeicher liegt?

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

C
366 Beiträge seit 2005
vor 17 Jahren

Meine Abspielklassen/-funktionen wollen alle einen string mit einem Filename haben...

2.921 Beiträge seit 2005
vor 17 Jahren

Deswegen habe ich ja den Tipp mit VLC gegeben. Du musst den Stream abspielen. Nicht einen Filenamen. Zum. hört es sich danach an, nachdem Du sagtest dass alle deine Abspielklassen einen Filenamen benötigen.

Meine benötigen keinen...

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

C
366 Beiträge seit 2005
vor 17 Jahren

Original von dr4g0n76
Meine benötigen keinen...

Und die wären?

2.921 Beiträge seit 2005
vor 17 Jahren

guck dich mal bei Codeproject um, da findest Du Anregungen. Ich werde meine Klassen hier nicht vorstellen. Ich könnte aber sobald ich mal dazu komme ein kleines Beispiel posten.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.