我想问一些关于Android的按键通话应用程序开发的问题。 最近,我一直在为Android开发即按即说应用程序。我使用 DatagramSocket 通过本地无线网络(W-LAN)发送语音和接收语音作为数据包。我使用点对点网络,所以没有服务器。
我对代码没有问题,但我不了解VoIP理论的基础,所以我想问一些问题,希望有人可以给我简单的答案:)
1。我的即按即说应用程序是否被认为是基于VOIP的?
2. 有几种VOIP协议,如SIP,H.323等等。如果我的PTT应用程序被认为是基于VOIP的,并且我使用Socket-Packet(UDP,我是对的?)来交换语音,那么我使用的是什么VOIP协议?它被认为是RTP协议吗?
我想了解我的PTT应用程序背后的理论,我理解我的java代码,但我没有适当的VOIP知识。 我试图在谷歌找到一些信息,但我仍然不明白我的PTT应用程序和VOIP技术之间的关系。 在此之前,我感谢你的新朋友,对不起我的英语!
答案 0 :(得分:1)
予。 “VoIP”是一个非常广泛的术语,但是,如果您的应用通过IP网络传输语音,它绝对是VoIP,尽管它可能使用完全专有的协议(例如Skype)。
II。 VoIP堆栈基本上分为两个元层 - 1)信令和2)媒体传输。它们中的每一个又由多个自己的层组成(例如,用于SIP:会话,对话,事务和传输层)。信令协议的示例是H.323,SIP,MGCP。最标准的媒体传输是RTP。你可以使用自己的交通工具; RTP应用特定限制(作为AVP配置文件),但与各种库和其他实现兼容。
有些协议对信令和媒体使用相同的套接字和相同的传输类型;广泛使用的是IAX。大多数其他信号和媒体是分开的,因此套接字是分开的,可能它们有不同的类型。符合标准的SIP实现应该在UDP和TCP上运行,并且对于大的请求切换到TCP(默认情况下> = 1300字节);还建议使用SCTP。对于所有传输,协议实现细节作为重传策略和请求超时以不同方式指定,但使用任何正确的L4协议没有主要问题。
另一个故事是媒体传输(根据RTP或同等规定)。在这里,以浮动延迟为代价传输所有数据的典型TCP方式对我们来说真的很讨厌。 TCP适用于批量流量类,如文件传输或数据库交互。在人类之间的互动交流中,我们比声音应变更喜欢噪音和零星的声音损失。因此,TCP在这里是一个非常糟糕的选择,并且应该使用同步传输类,并且UDP是良好的默认选择。 SCTP也可以用作媒体传输,但具有有限的重传选项(并非所有堆栈都支持它)。 (有尝试使用TCP来穿越NAT点,但这一切都是绝望的行为。)
如果您的应用程序假设一次发送一个语音消息而不是一个接收者(即一种广播或多播),则拒绝使用面向连接的媒体传输,有效地仅保留UDP。这也需要在信令级别进行适当的协商。
III。语音编解码器的选择是特定于平台的,我不使用哪些是原生的Android。在“大”VoIP中,有许可设置和免费设置,具有非常小的交叉点(AFAIR,G.711和GSM)。尽管如此,有很好的编解码器(例如Opus)可以适应各种要求,包括部分丢包。