如何通过UDP发送实时数据?

时间:2010-09-19 18:29:50

标签: .net vb.net udp udpclient

我必须尽可能快速,实时地通过UDP发送一系列视频帧,当我掌握基本功能时,我遇到了各种各样的困难。我的一些目标:

  1. 数据通常通过拨号发送(因此UDP而不是TCP),但也需要支持快速以太网。

  2. 偶尔丢帧(因此UDP而不是TCP)是可以的。

  3. 需要低延迟。远程接收的帧应该是最近发送的帧(在缓冲区中等待的帧数不超过几帧)。

  4. 我需要能够检测有效带宽,以便我可以或多或少地压缩帧以保持帧速率。

  5. 我已成功实现了大部分内容:

    1. 我将帧数据分解为一个或多个大约500字节的数据报,每个数据报都有一个序列号和其他信息。接收器重新组装整个帧并检测是否缺少任何数据报。

    2. 如果接收方检测到超过一定百分比的丢帧(例如,过去10帧中的50%),我会向发送方发送TCP消息以减慢50%。发送者比每个后续帧慢慢增加5%的速度。

    3. 使用System.Net.Sockets.UdpClient发送和接收数据。

    4. 我有一个单独的TCP通道,用于将控制消息发送回发件人。

    5. 我现在面临的主要困难是检测有效带宽并处理延迟,尤其是拨号时(最大约4,000字节/秒)。例如,如果我尝试使用TcpClient.Send()发送100,000字节/秒,则它们似乎到达(没有丢弃的数据报),但是在最后一个数据报到达时具有大的延迟。我认为TcpClient.Send()函数是阻塞的,直到缓冲区能够发送,这会混淆我当前的算法。

      任何人都可以向我指出有关如何:

      的任何信息来源
      1. 通过UDP检测实际带宽。

      2. 动态调整带宽以适应可用管道的更好算法。

      3. 以所需的带宽顺畅发送数据。

      4. 一种检测并将延迟降至最低的方法。

      5. 上周我一直在转动轮子,每当我解决一个问题时,看起来另一个问题就是头部。

1 个答案:

答案 0 :(得分:2)

您还可以为每个数据包添加时间戳。然后你可以检测延迟是否增加。在这种情况下,您发回一条消息以减少带宽。

在创建连接时,您可以使用极少的数据包检测延迟。此值不应在运行时更改。