我正在为视频会议应用程序设计自己的传输协议。我想知道基于连接或基于无连接的方法是否更适合此应用程序。协议的选择?
协议的选择?
回答
TCP要注意的是(假设某种MPEG-ish编码),如果数据包由于网络问题而延迟,则视频将冻结或延迟,直到数据到达。根据TCP的定义,视频将是无错误的。
使用UDP,虽然视频是连续的,但您可以在视频中看到错误。对于MPEG格式的协议,数据以周期性关键帧的形式发送,然后在它们之间发送增量帧,如果包含增量帧的UDP数据包未能到达,则视频将变得块状,并且通常容易出错连接降级。如果关键帧被遗漏,那么你会得到其他错误,可能根本没有视频。
如果您将摄像机指向正在移动的位置,并且丢失三角形帧会使图像变得混乱,则可能需要TCP以确保如果您获取视频,则至少应该是准确的。然而,如果你指的是相当平静的东西(如果是视频会议,你可能不会这么做),那么UDP就足够了,因为偶尔的delta帧丢失可能不会影响整体视频质量。请注意,如果您真的从头开始自己的解决方案,那么您可以添加代码以允许发生故障并尝试以特殊方式处理它们(例如,如果帧滞后于超时,则超时TCP连接很多,并相应地通知用户)。
我开发的游戏包括那些被归类为“抽搐”游戏的游戏,如赛车和FPS游戏。对于这种类型的游戏,延迟非常重要。您不能使用TCP,因为它可以保证按顺序传送,并且在处理重发时保留传入数据包。
我们所做的大部分工作是使用我们称之为Stateful UDP的方法。所有这一切意味着我们在消息中添加了一个数据包ID。当我们收到消息时,我们检查了身份证。如果ID高于我们目前看到的最高ID,则我们接受并处理该数据包。如果它更低,我们放弃它。当延迟很重要时,这种方法运行良好,因为即使使用UDP,您也会收到大部分数据包,而且大部分都会按顺序排列。
TCP不适合这种应用程序。问题在于重传。如果接收方判定数据包丢失或损坏,并请求重传,则TCP不允许重传单个数据包。丢失/损坏的数据包中的每个数据包都会被重新传输。随着网络中不断出现的高带宽数据包流量的出现,一个小故障会导致视频流中出现无法接受的滞后现象,您可能无法从中恢复。
使用UDP作为传输,并设计应用层,以便在网络状况恶化时可以优雅地降级。
视频和音频流并不那么简单。你应该看看已经存在的东西 - RTP,知道你想要重塑的东西;-)
- 1. 选择日志协议
- 2. 扩展OkHttp协议选择
- 3. Java如何为ClientHello选择协议
- 4. 从协议扩展调用选择
- 5. 指示协议响应任何选择
- 6. 在WinSCP脚本中选择FTP协议
- 7. 核心位置选择加入协议
- 8. 如何选择安全传输协议
- 9. Swift选择器到协议功能?
- 10. 带选项协商的TFTP协议
- 11. 协议的哈希协议
- 12. WebDav协议VS HTTP协议
- 13. 腻子选美协议?
- 14. 是基于现有协议的协议还是协议?
- 15. 我想选择的传输层安全协议中的urllib2
- 16. Arduino和Raspberry Pi之间的无线交换:协议的选择
- 17. 在UDP协议中的Tracerouting协议
- 18. 协议内的Objective-C协议
- 19. 在ObjC协议上的协议扩展
- 20. 服务器选择不支持或禁用的协议:SSLv3
- 21. 文件传输的选择性重复协议
- 22. 听基于web的协议处理程序选择
- 23. 选择正确的聊天协议实施
- 24. iOS的协议
- 25. 的AppDelegate协议
- 26. Swift:设置协议的可选属性
- 27. Swift 3可选的绑定协议
- 28. 目标C:模块与选择器与协议
- 29. 为回合制游戏服务器选择哪种协议
- 30. 无法接收数据时选择和UDP协议组合
你的竞争对手使用什么?大多数视频似乎都是UDP数据包,但您应该查看所有竞争协议,以便您可以创造出更好的协议。 – 2010-02-16 18:11:39