我正在为视频会议应用程序设计自己的传输协议。我想知道基于连接或基于连接的方法对于此应用程序是否更好。
答案 0 :(得分:4)
我开发了游戏,包括被归类为“抽搐”游戏的游戏,如赛车和FPS游戏。对于这种类型的游戏,延迟非常重要。您不能使用TCP,因为它可以保证按顺序传送,并在处理重新发送时保留传入的数据包。
我们为大多数人所做的是使用我们所谓的有状态UDP。所有这一切真正意味着我们在消息中添加了一个数据包ID。当我们收到消息时,我们检查了ID。如果ID高于我们看到的最高ID,我们接受并处理了该数据包。如果它更低,我们放弃它。当延迟很重要时,这种方法很有效,因为即使使用UDP,您也会收到大部分数据包,而且大多数数据包都是有序的。
答案 1 :(得分:1)
TCP要注意的是(假设某种MPEG-ish编码)如果数据包由于网络问题而延迟,视频将冻结或延迟,直到数据到达。根据TCP的定义,视频将没有错误。
使用UDP,视频将持续播放,您可能会在视频中出错。使用MPEG格式协议,其中数据以周期性关键帧的形式发送,然后在它们之间发送增量帧,如果包含增量帧的UDP数据包无法到达,那么您的视频将变得模糊,并且通常容易出错。连接降级。如果错过了一个关键帧,那么你将得到其他错误,可能根本就没有视频。
如果您指向相机的位置正在移动,并且增量帧丢失会使图像混乱,那么可能需要TCP以确保如果您获得视频,则至少是准确的。但是,如果你指的是相当静止的东西(如果用于视频会议则可能不是这样),那么UDP就足够了,因为偶尔的delta帧丢失可能不会影响整体视频质量。
另请注意,如果您真的从头开始编写自己的解决方案,那么您可以添加代码以允许毛刺并尝试以特殊方式处理它们(例如,如果帧滞后很多,则超时TCP连接,并相应地通知用户。)
答案 2 :(得分:1)
TCP不适合此类应用程序。问题在于重传。如果接收方确定数据包丢失或损坏,并请求重传,则TCP不允许重传单个数据包。来自丢失/损坏的数据包的每个数据包都将被重新传输。通过网络上的恒定,高带宽数据包流,一个小故障将导致视频流中无法接受的滞后,而这些滞后可能无法从中恢复。
使用UDP作为传输,并设计应用程序层,以便在网络状况恶化时优雅地降级。
答案 3 :(得分:1)
视频和音频流并不那么简单。你应该看一下已经存在的东西 - RTP,知道你想要重新发明什么; - )