要正确回答这个问题,我觉得需要解释 VoIP 的一些关键概念。
首先,UDP 是最流行和广泛使用的 VoIP 方法。请记住,IP 网络是分组交换的,非常适合非实时数据通信,而不是为实时 VoIP 设计的。
为了克服这个问题,使用了 UDP。UDP 是不可靠且无连接的协议。虽然 UDP 会丢包,但语音音频仍然可以理解,大脑会有效地弥补错误。这就是为什么您仍然可以通过 3 格信号的电话与某人通话。
数据包丢失和突发长度
丢包通常是由于拥塞而发生的,因此丢包的数量将取决于网络的设备状况。使用 UDP 的 VoIP 中的数据包丢失最常发生在突发长度中。突发长度是传输过程中连续丢失的数据包数,因此突发长度为 3 意味着连续丢失了 3 个数据包。
丢包补偿
在发生丢包的情况下,简单的丢包补偿技术将会出现,并且服务质量不会受到严重影响,即使在 20-30% 的数据包丢失的情况下,语音仍然可以被理解。方法包括:
重复上次成功接收的数据包。
填补 - 在空白处播放沉默。
拼接 - 实际上,这可以考虑通过将间隙的开始和结束推到一起来消除由突发长度引起的间隙。
- 插值 - 使用之前和之后的语音知识在间隙内插值丢失的数据包,例如在突发长度之前和之后成功接收的数据包之间的平均值。
一种减小突发长度大小的好方法称为交织,因此提高 QoS 的方法是交织。块交织功能获取语音并将其拆分为一组数据包。这些数据包被加载到矩阵形状的缓冲区中(例如 4 x 4),使用一个函数旋转或转置缓冲区,以便数据包不按顺序排列。在接收方,此函数的逆函数用于重新排序数据包。这种方法简单有效,见下图:
替代文字 http://img688.imageshack.us/img688/3962/capturevnk.png
我最近创建了一个小型 VoIP 应用程序。通过使用 UDP 的无线 LAN。我不太确定您的应用程序的确切要求,但通常 VoIP 应用程序(在两个主机之间)可以按如下方式实现:
替代文字 http://img338.imageshack.us/img338/6566/captureec.png
在图中,应用程序定义了它自己的数据包设计。标头可能只是数据包编号(使用 1 个字节),而有效负载是音频数据(n 个字节,有效负载的大小)。定义这允许更好的数据包补偿技术,并允许编程的逻辑流程。
TCP 对于 VoIP 来说是一个糟糕的选择,原因有几个。“TCP VoIP”的快速谷歌揭示了为什么第一个结果支持这种观点。
TCP 是一种可靠的、面向连接的协议,这意味着在传输中丢失的数据包将在某个时候从另一台主机重新发送。这种重新传输对于实时服务是不切实际的,并且会增加抖动、延迟并可能增加丢包(在某些情况下)。
回答您的问题
我得到的基本上只是噪音。其中 20% 是录制的声音,其余的只是奇怪的噪音。
TCP 不应该引入噪声,它应该引入抖动和延迟。套接字往往有一个自动定义的超时时间,你定义了超时时间吗?如果不是,为什么您没有在播放前及时收到正确的数据包?
我在正确的轨道上吗?将 TCP/IP 用于此类应用程序(各种语音会议)是否是个好主意?
不,不要使用 TCP/IP,这不是一个好主意。您的经理似乎错误地认为任何数据包丢失都是一件可怕的事情。
概括
这里展示了一些通用的关键概念,以尽可能多地尝试和帮助解决这个特定问题,但是这不应被认为是详尽无遗的。确保 VoIP 系统还使用语音编码/信号处理技术的一些基本原理。
要记住的关键点是:
我希望这有帮助。