android - 我的 Android 应用程序上的 VOIP

标签 android sockets networking voip

我想问一些关于开发我的 Android 一键通应用程序的问题。 最近,我一直在为 Android 开发一键通应用程序。我使用 DatagramSocket 通过本地无线网络 (W-LAN) 以数据包 的形式发送和接收语音。我使用点对点网络,所以没有服务器。

我对代码没有问题,但是我不了解VoIP理论的基础,所以我想问一些问题,希望有人能给我简单的答案:)

1.我的一键通应用程序是否被视为基于 VOIP 的应用程序?

2. 有多种 VOIP 协议(protocol),例如 SIP、H.323 等等。如果我的 PTT 应用程序被认为是基于 VOIP 的,并且我使用 Socket-Packet(UDP,对吗?)来交换语音,那么我使用什么 VOIP 协议(protocol)?算不算RTP协议(protocol)?

我想了解我的 PTT 应用程序背后的理论,我了解我的 java 代码,但我没有适当的 VOIP 知识。 我试图在谷歌中查找一些信息,但我仍然不明白我的 PTT 应用程序和 VOIP 技术之间的关系是什么。 先谢谢了,我是新来的,对不起我的英语!

最佳答案

我。 “VoIP”是一个非常宽泛的术语,但是,如果您的应用通过 IP 网络传输语音,那么它绝对是 VoIP,尽管它可能使用完全专有的协议(protocol)(例如 Skype)。

二。 VoIP 堆栈基本上分为两个元层 - 1) 信令和 2) 媒体传输。它们中的每一个依次包含多个自己的层(例如,对于 SIP: session 、对话、事务和传输层)。信令协议(protocol)的例子有 H.323、SIP、MGCP。最标准的媒体传输是 RTP。您可以使用自己的交通工具; RTP 应用特定限制(如 AVP 配置文件)但与各种库和其他实现兼容。

有些协议(protocol)对信令和媒体使用相同的套接字和相同的传输类型;广泛使用的是IAX .大多数其他人将信号和媒体分开,因此套接字是分开的,并且它们可能具有不同的类型。符合标准的 SIP 实现应同时在 UDP 和 TCP 上运行,并为大请求切换到 TCP(默认情况下 >=1300 字节);还建议使用 SCTP。对于所有传输,重传策略和请求超时等协议(protocol)实现细节以不同的方式指定,但使用任何正确的 L4 协议(protocol)都没有主要问题。

完全不同的是媒体传输(在 RTP 或等效协议(protocol)下)。在这里,以 float 延迟为代价传输所有数据的典型 TCP 方式对我们的耳朵来说真的很讨厌。 TCP 适用于批量流量类,如文件传输或数据库交互。在人与人之间的互动交流中,我们更喜欢更多的噪音和零星的声音丢失,而不是声音紧张。因此,TCP 在这里是一个非常糟糕的选择,应该使用同步传输类,而 UDP 是不错的默认选择。 SCTP 也可以用作媒体传输,但重传选项有限(并非所有堆栈都支持)。 (有人尝试使用 TCP 打通 NAT 点,但这一切都是绝望的行为。)

如果您的应用程序假设一次向多个接收者发送语音消息(即一种广播或多播),这将拒绝使用面向连接的媒体传输,有效地仅保留 UDP。这也需要在信令级别进行适当的协商。

三。语音编解码器的选择是非常特定于平台的,我不使用哪些是 Android 原生的。在“大”VoIP 中,有许可集和免费集,交集很小(AFAIR、G.711 和 GSM)。尽管如此,还是有很好的编解码器(例如 Opus )可以适应广泛的要求,包括部分丢包。

关于android - 我的 Android 应用程序上的 VOIP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27179705/

相关文章:

android - 如何通过 Web API 管理 Android 与外部设备的通信?

.net - 提高UDP可靠性

android - 检测 ListView(或 ScrollView)内的滚动位置

android - 本地存储加载线圈的图像?

WINDOWS 上的 Python flask 双栈(ipv4 和 ipv6)

c++ - 我从哪里获得 arpa/inet.h?

linux - 如何在 Linux 中获取所有 TCP 连接的 min/avg/var rtt?

android - ConstraintLayout 不会正确调整大小(实际上)

android - 自定义抽屉导航器 - React Native

java - InputStream的read()方法是如何实现的?