2010-02-16 64 views
3

我正在为视频会议应用程序设计自己的传输协议。我想知道基于连接或基于无连接的方法是否更适合此应用程序。协议的选择?

+0

你的竞争对手使用什么?大多数视频似乎都是UDP数据包,但您应该查看所有竞争协议,以便您可以创造出更好的协议。 – 2010-02-16 18:11:39

回答

1

TCP要注意的是(假设某种MPEG-ish编码),如果数据包由于网络问题而延迟,则视频将冻结或延迟,直到数据到达。根据TCP的定义,视频将是无错误的。

使用UDP,虽然视频是连续的,但您可以在视频中看到错误。对于MPEG格式的协议,数据以周期性关键帧的形式发送,然后在它们之间发送增量帧,如果包含增量帧的UDP数据包未能到达,则视频将变得块状,并且通常容易出错连接降级。如果关键帧被遗漏,那么你会得到其他错误,可能根本没有视频。

如果您将摄像机指向正在移动的位置,并且丢失三角形帧会使图像变得混乱,则可能需要TCP以确保如果您获取视频,则至少应该是准确的。然而,如果你指的是相当平静的东西(如果是视频会议,你可能不会这么做),那么UDP就足够了,因为偶尔的delta帧丢失可能不会影响整体视频质量。请注意,如果您真的从头开始自己的解决方案,那么您可以添加代码以允许发生故障并尝试以特殊方式处理它们(例如,如果帧滞后于超时,则超时TCP连接很多,并相应地通知用户)。

+0

游戏使用UDP,因此路由器将通过网络发送UDP数据包。 – Martin 2010-02-16 18:36:53

+0

好点,我会编辑一下。 – Kazar 2010-02-16 18:41:49

+1

TCP重传将使实时视频变得混乱。视频到达时可能没有错误,但在TCP重新传输时,网络层的任何错误都将导致总体冻结。应用层还必须足够聪明,以便在数据落后时丢弃数据,否则两端之间的延迟只会在每次重新传输时都会扩大。 – 2010-02-16 19:15:57

4

我开发的游戏包括那些被归类为“抽搐”游戏的游戏,如赛车和FPS游戏。对于这种类型的游戏,延迟非常重要。您不能使用TCP,因为它可以保证按顺序传送,并且在处理重发时保留传入数据包。

我们所做的大部分工作是使用我们称之为Stateful UDP的方法。所有这一切意味着我们在消息中添加了一个数据包ID。当我们收到消息时,我们检查了身份证。如果ID高于我们目前看到的最高ID,则我们接受并处理该数据包。如果它更低,我们放弃它。当延迟很重要时,这种方法运行良好,因为即使使用UDP,您也会收到大部分数据包,而且大部分都会按顺序排列。

1

TCP不适合这种应用程序。问题在于重传。如果接收方判定数据包丢失或损坏,并请求重传,则TCP不允许重传单个数据包。丢失/损坏的数据包中的每个数据包都会被重新传输。随着网络中不断出现的高带宽数据包流量的出现,一个小故障会导致视频流中出现无法接受的滞后现象,您可能无法从中恢复。

使用UDP作为传输,并设计应用层,以便在网络状况恶化时可以优雅地降级。

1

视频和音频流并不那么简单。你应该看看已经存在的东西 - RTP,知道你想要重塑的东西;-)