AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Problem mit UDP-Stream
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit UDP-Stream

Ein Thema von GeMo · begonnen am 28. Sep 2009 · letzter Beitrag vom 30. Sep 2009
Antwort Antwort
GeMo

Registriert seit: 25. Jan 2006
80 Beiträge
 
Delphi 7 Professional
 
#1

Problem mit UDP-Stream

  Alt 28. Sep 2009, 17:00
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
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Problem mit UDP-Stream

  Alt 28. Sep 2009, 17:07
"sizeof(AudioData^)" sieht schonmal nicht gut aus. Es gibt doch anscheinend einen passenden Parameter.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
GeMo

Registriert seit: 25. Jan 2006
80 Beiträge
 
Delphi 7 Professional
 
#3

Re: Problem mit UDP-Stream

  Alt 28. Sep 2009, 19:47
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!

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

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Problem mit UDP-Stream

  Alt 28. Sep 2009, 19:53
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
Klaus
  Mit Zitat antworten Zitat
GeMo

Registriert seit: 25. Jan 2006
80 Beiträge
 
Delphi 7 Professional
 
#5

Re: Problem mit UDP-Stream

  Alt 28. Sep 2009, 19:56
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..
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Problem mit UDP-Stream

  Alt 28. Sep 2009, 20:39
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.
fork me on Github
  Mit Zitat antworten Zitat
GeMo

Registriert seit: 25. Jan 2006
80 Beiträge
 
Delphi 7 Professional
 
#7

Re: Problem mit UDP-Stream

  Alt 29. Sep 2009, 14:29
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
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Problem mit UDP-Stream

  Alt 30. Sep 2009, 00:15
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.
fork me on Github
  Mit Zitat antworten Zitat
GeMo

Registriert seit: 25. Jan 2006
80 Beiträge
 
Delphi 7 Professional
 
#9

Re: Problem mit UDP-Stream

  Alt 30. Sep 2009, 08:45
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 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 von sx2008:
Ist auf jeden Fall ein interessantes Thema; also dranbleiben.
Ganz meine Meinung

Gruß GeMo
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:05 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