Laden...

Video über Udp senden. Massive Artefakte

Erstellt von Unfug vor 14 Jahren Letzter Beitrag vor 14 Jahren 4.659 Views
U
Unfug Themenstarter:in
133 Beiträge seit 2006
vor 14 Jahren
Video über Udp senden. Massive Artefakte

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".

Gelöschter Account
vor 14 Jahren

bei UDP sendet man üblicherweise die packete mehrfach und hofft das zumindest eines davon ankommt.

das bei dir diese artefakte auftreten bedeutet nur, das regelmäßig packete verloren gehen.

U
Unfug Themenstarter:in
133 Beiträge seit 2006
vor 14 Jahren

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.

Gelöschter Account
vor 14 Jahren

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.

U
1.688 Beiträge seit 2007
vor 14 Jahren

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.

F
10.010 Beiträge seit 2004
vor 14 Jahren

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?

U
Unfug Themenstarter:in
133 Beiträge seit 2006
vor 14 Jahren

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.

????

  1. Ich habe nie gesagt, dass ich dir nicht glaube.
  2. Die Aussage mit dem Netzwerk war nur ein "Hinweis" um eine Fehlerquelle auszuschließen und bezog sich in keinster Weise auf deine vorherige Aussage.

@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".

F
10.010 Beiträge seit 2004
vor 14 Jahren

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.

T
433 Beiträge seit 2006
vor 14 Jahren

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

U
Unfug Themenstarter:in
133 Beiträge seit 2006
vor 14 Jahren

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