Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Problem mit UDP-Stream (https://www.delphipraxis.net/140902-problem-mit-udp-stream.html)

GeMo 28. Sep 2009 16:00


Problem mit UDP-Stream
 
hallo leute!
Ich hoffe ihr könnt mir helfen. und zwar bin ich gerade dabei ein kleines vo-ip-programm zu schreiben.
Das ganze soll auf UDP basieren.
Für die realisierung verwende ich die komponente TUDPSockUtil und für die audiowiedergabe/aufnahme benutze ich die deAudios..

vielen dank schonmal für eure unterstützung!

EDIT:
weiter unten der funktionierende code!


gruß GeMo

sirius 28. Sep 2009 16:07

Re: Problem mit UDP-Stream
 
"sizeof(AudioData^)" sieht schonmal nicht gut aus. Es gibt doch anscheinend einen passenden Parameter.

GeMo 28. Sep 2009 18:47

Re: Problem mit UDP-Stream
 
Zitat:

Zitat von sirius
"sizeof(AudioData^)" sieht schonmal nicht gut aus. Es gibt doch anscheinend einen passenden Parameter.

oh.. danke für den hinweis.. hab ich wohl irgendwie übersehen! :P

habs oben im code geändert..
jetzt hab ich kein knacken mehr, allerdings pfeift und rauscht es nun die ganze zeit.. :/

Klaus01 28. Sep 2009 18:53

Re: Problem mit UDP-Stream
 
Zitat:

Zitat von GeMo
jetzt hab ich kein knacken mehr, allerdings pfeift und rauscht es nun die ganze zeit.. :/

Pfeifen könnte auf Rückkopplung schließen lassen.
Abhilfe Lautsprecher und Mikrofon räumlich von einander entfernen.
Oder es mal mit Kopfhörern probieren.

Grüße
Klaus

GeMo 28. Sep 2009 18:56

Re: Problem mit UDP-Stream
 
Zitat:

Zitat von Klaus01
Pfeifen könnte auf Rückkopplung schließen lassen.
Abhilfe Lautsprecher und Mikrofon räumlich von einander entfernen.
Oder es mal mit Kopfhörern probieren.

das mache ich schon ;) benutze im moment kopfhörer und ein extra mikro.. normalerweise darf es daran nicht liegen..

sx2008 28. Sep 2009 19:39

Re: Problem mit UDP-Stream
 
Es gibt keinen UDP Stream. UDP und Stream sind zwei widersprüngliche Dinge.
Der Sender schickt mehrere UDP-Pakete an den Empfänger.
Der Empfänger bekommt davon evtl. nur einen Bruchteil mit.
Ausserdem muss man damit rechnen, dass die Pakete nicht in der Reihenfolge eintreffen, in der sie gesendet wurden.
Oder Pakete können doppelt eintreffen.
Jedes Paket braucht also eine fortlaufende Nummer, damit der Empfänger sie in die richtige Reihenfolge bringen kann.
Beispiel:
Der Sender schickt die Pakete 1 bis 10 und der Empfänger bekommt: 1,2,3,5,7,6,8,9,10.
Das bedeutet, dass der Empfänger einen Puffer für mehrere Pakete braucht.
Dieser (Ring-)puffer wird nun in zeitgleichen Abständen ausgelesen und zur Soundkarte geschickt.
Sollte eine Nummer im Puffer fehlen, gibt's halt einen Aussetzer.

PS: ich würde zuerst mal mit TCP/IP beginnen; das ist einfacher aber trotzdem noch schwer genug.

GeMo 29. Sep 2009 13:29

Re: Problem mit UDP-Stream
 
danke für eure hinweise!
ich hab mich aber weiter an udp rangesetzt und es jetzt auch hinbekommen! :)

hier mal die wichtigen teile des codes:

Delphi-Quellcode:
type
  TBuf = Array[1..4096] of byte;

[...]

var
  buffer1, buffer2 : TBuf;
  useFirstBuffer : boolean = true;
  bufferPos : integer = 0;
Delphi-Quellcode:
procedure TForm1.deAudioInAudioRecorded(Sender: TObject; AudioData: Pointer; AudioDataSize: Integer);
begin
 Client.sendbuf(AudioData^, AudioDataSize);
end;
Delphi-Quellcode:
 size := client.ReceiveLength;
 if(useFirstBuffer) then
 begin
  if(bufferPos + size <= SizeOf(buffer1)) then
  begin
    client.ReceiveBuf(buffer1, size, vonIP);
    deAudioOut.PlayAudio(@buffer1, Size);
    bufferPos := bufferPos + size;
  end
  else
  begin
   ZeroMemory(@buffer1,SizeOf(buffer1));
   useFirstBuffer := false;
   client.ReceiveBuf(buffer2, size, vonIP);
   deAudioOut.PlayAudio(@buffer2, Size);
   bufferPos := 0;
  end;
 end
 else
 begin
  if(bufferPos + size <= SizeOf(buffer2)) then
  begin
    client.ReceiveBuf(buffer2, size, vonIP);
    deAudioOut.PlayAudio(@buffer2, Size);
    bufferPos := bufferPos + size;
  end
  else
  begin
   ZeroMemory(@buffer2,SizeOf(buffer2));
   useFirstBuffer := false;
   client.ReceiveBuf(buffer1, size, vonIP);
   deAudioOut.PlayAudio(@buffer1, Size);
   bufferPos := 0;
  end;
 end;
ich weiss es ist kein schöner code, aber er erfüllt seinen zweck.. vielleicht hilft das ja jemandem weiter, der genau dasselbe problem hatte wie ich ^^ :)

gruß GeMo

sx2008 29. Sep 2009 23:15

Re: Problem mit UDP-Stream
 
Wenn ich das richtig sehe, benützt du jetzt zwei Puffer im Wechsel ohne Berücksichtigung der Reihenfolge oder der Möglichkeit, dass UDP-Pakete doppelt eintreffen.
Im lokalen Netzwerk und im gleichen Segment funktioniert das, aber wenn Router (wie im Internet) dazwischen sind kann es Probleme geben.
Für Sendungen übers Internet müsstest du auch deine Puffergrösse zurückfahren (Richtwert 1kB)
um IP-Fragmentierung zu vermeiden.

Ist auf jeden Fall ein interessantes Thema; also dranbleiben. :hi:

GeMo 30. Sep 2009 07:45

Re: Problem mit UDP-Stream
 
Zitat:

Zitat von sx2008
Wenn ich das richtig sehe, benützt du jetzt zwei Puffer im Wechsel ohne Berücksichtigung der Reihenfolge oder der Möglichkeit, dass UDP-Pakete doppelt eintreffen.
Im lokalen Netzwerk und im gleichen Segment funktioniert das, aber wenn Router (wie im Internet) dazwischen sind kann es Probleme geben.

danke für den hinweis, ich hab mir sowas zwar schon gedacht, aber hab bisher noch keine möglichkeit gefunden das zu beheben (ausser mit records).. werd mich da mal durchhangeln.. :)

Zitat:

Zitat von sx2008
Für Sendungen übers Internet müsstest du auch deine Puffergrösse zurückfahren (Richtwert 1kB)
um IP-Fragmentierung zu vermeiden.

Der Sendepuffer ist auch auf 1kB eingestellt (in der deAudioIn-Komponente), Buffer1 & Buffer2 sind hier nur die Empfangspuffer für die Wiedergabe. Trotzdem danke für den Hinweis :)

Zitat:

Zitat von sx2008
Ist auf jeden Fall ein interessantes Thema; also dranbleiben. :hi:

Ganz meine Meinung ;)

Gruß GeMo


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz