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!
Ich sollte genau das selbe haben.
Weiß da niemand was?
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.
@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
====
Sendet diese über TCP-IP nach aussen.
Der Client muss die Daten bekommen
Client
====
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.
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...
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...
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...
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...
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.
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.
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...
Meine Abspielklassen/-funktionen wollen alle einen string mit einem Filename haben...
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.
Original von dr4g0n76
Meine benötigen keinen...
Und die wären?
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.