![]() |
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 |
Re: Problem mit UDP-Stream
"sizeof(AudioData^)" sieht schonmal nicht gut aus. Es gibt doch anscheinend einen passenden Parameter.
|
Re: Problem mit UDP-Stream
Zitat:
habs oben im code geändert.. jetzt hab ich kein knacken mehr, allerdings pfeift und rauscht es nun die ganze zeit.. :/ |
Re: Problem mit UDP-Stream
Zitat:
Abhilfe Lautsprecher und Mikrofon räumlich von einander entfernen. Oder es mal mit Kopfhörern probieren. Grüße Klaus |
Re: Problem mit UDP-Stream
Zitat:
|
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. |
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:
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 ^^ :)
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; gruß GeMo |
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 ![]() Ist auf jeden Fall ein interessantes Thema; also dranbleiben. :hi: |
Re: Problem mit UDP-Stream
Zitat:
Zitat:
Zitat:
Gruß GeMo |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz