Hallo Community,
Ich sitze an einem Problemchen und sehe den Wald vor lauter Bäumen nicht.
Folgendes einfaches Szenario:
Datei (xy.mpg) soll als Udp Multicast ins Netzwerk und zwar an die Multicast Adresse (224.0.0.42:1234) gesendet werden.
Jeder der Lust hat kann dann mittels VLC (udp://224.0.0.42:1234) sich diesen Stream angucken.
//Die xy.mpg Datei als Stream
FileStream file = new FileStream("xy.mpg",FileMode.Open);
//DER UDP SERVER
Socket multicastSender = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
multicastSender.Bind(new IPEndPoint(IPAddress.Any, 0));
multicastSender.Connect(new IPEndPoint(IPAddress.Parse("224.0.0.42"), 1234));
//ein paar zusätzliche Lokale Variablen
byte[] buffer = new byte[8000]; //Den Wert 8000 habe ich schon von 500 bis 60000 ersetzt. Keinerlei besserung.
int chunk = 0;
//Es folgt die Schleife, die für das Auslesen der Datei sowie das sofortige Senden zuständig ist
while (true)
{
//Der buffer wird nicht bei jedem Lesevorgang vollständig gefüllt, weshalb diese //If-Abfrage rein muss. Erst bei vollem Buffer, wird auch gesendet.
if (chunk < buffer.Length)
{
chunk += file.Read(buffer, chunk, buffer.Length - chunk);
}
else
{
chunk = 0;
multicastSender.Send(buffer,SocketFlags.None);
}
}
Problem ist, dass ich über VLC jede Menge Artefakte bekomme und auch abgeharkten Ton.
Mir ist bewusst, dass Udp kein verbindungsorientiertes Protokol ist und somit die Daten auch "durcheinander" ankommen können. Aber ich habe nicht ein Bild was ordentlich ist. Das kann doch nicht richtig sein oder?
Wieso das Ganze: Das Ganze hat einen rein "messtechnischen" Zweck. Ich benötige eine Code, der mir einen Stream (egal ob von einer Datei oder anderswo her) lokal ins Netzwerk als Mutlicast sendet.
Hat jemand eine Idee?r
P.S.: Der VLC als StreamServer und als Client funktioniert einwandfrei.
Man kann also Mithilfe VLC eine Datei als UDP Multicast streamen, was funktioniert. Ich brauche jedoch eine "eigene Lösung".
Hi Jack30lena,
ich habe jetzt testweise mal ein
Thread.Sleep(5);
eingefügt
multicastSender.Send(buffer, SocketFlags.None);
System.Threading.Thread.Sleep(5);
Die Artefakte werden weniger, aber es treten Bildfehler in Form von "Wiederholungen" auf.
Das der Rechner und das Netzwerk "fähig" sind, zeigt der Test mit VLC als UDP Streamserver.
Das der Rechner und das Netzwerk "fähig" sind, zeigt der Test mit VLC als UDP Streamserver.
VLC ist OpenSource - schau doch mal, wie das dort gemacht wird.
Das kann doch nicht richtig sein oder?
Doch.
Warum meinst du wird bei Videostreamings so viel SW erstellt, damit man komprimierte
Bildfolgen auch als soche erkennen kann?
Das der Rechner und das Netzwerk "fähig" sind, zeigt der Test mit VLC als UDP Streamserver.
nein. das zeigt nur, das die etwas richtig machen, was du falsch machst.
wenn du mir nicht glauben magst, kann ich dir nciht helfen.
????
@ujr:
Hab ich grad gemacht. Bin da noch nicht ganz durchgestiegen, aber ich glaube es entspricht dem was FZelle sagt. Die scheinen das irgendwie zu "komprimieren".
Das ist nicht ganz richtig.
Die Videos werden Komprimiert, damit sie mit der Bandbreite auskommen.
Der richtige Aufwand wird dann betrieben um die dabei entstandenen Daten
in der richtigen reihenfolge zusammenzubauen, denn gerade bei Streams
wie H.263/H.264 sieht man sonst nur das, was Du auch schon hattest.
Hi,
Streaming von Videos ist nicht so simpel wie es aussieht 😉
Du kannst nicht einfach hergehen und byteweise das Zeug über den Äther schicken.
Es gibt dafür Transport Protokolle. Siehe z.B. Wikipedia: MPEG Transport Stream
Am einfachsten ist es wohl per VLC zu streamen.
Ansonsten musst du dir die Transportprotokolle anschauen.
Wenn ich mich nicht ganz irre dürfte ISO/IEC 13818-1:2000 schon mal ein guter Anfang sein.
Ich würde mir eine Komponente holen (z.B. VideoCapX) oder halt VLC dazu nutzen, alles andere artet schnell aus.
Gruß,
Tom
Hallo Tom,
im Grunde habe ich auch einen MPEG2-TS (von DVB).
Ich hatte gedacht, dass ein einfaches weiterleiten als UDP-Multicast möglich wäre.
Aber scheinbar gehen wohl zuviele Informationen verloren/durcheinander.
Ich hätte nicht gedacht, dass innerhalb eines kleinen Heimnetzwerkes soviele Daten durcheinander geraten.
Da mir die Zeit derzeit fehlt komplexere Routinen zu schreiben wie einen Clienten, der fehlende UDP Daten neu anfordert, werde ich mich erstmal mit VLC begnügen.
Danke für eure Tipps, haben mich aufjedenfall weitergebracht.
Unfug