如何在不使用API​​的情况下制作音频RTP数据包以及RTP数据包的传输和解包

时间:2017-12-06 19:12:27

标签: java voip rtp

我是VoIP新手。我想知道创建一个使用RTP使用客户端/服务器架构传输音频的应用程序。可以使用不同的API 我需要了解核心级别。我研究过RFC。任何人都可以建议我如何制作音频RTP数据包并将其与 JAVA 中的数据包解包一起发送到服务器。 提前感谢。

1 个答案:

答案 0 :(得分:1)

创建一个空的Java类。

为RTP标头中的所有字段添加成员。将bool用于单个位字段。对于数字字段,您需要注意所需的位数,即对SSRC使用int,时间戳,序列的缩写,有效载荷类型的字节等.CSRC应该是一个数组(或arrayList或其他)的整数。音频有效载荷应该是一个字节数组。

数据包只是字节数组,因此您需要一个输出数据包byte []的ToBytes()方法,以及一个以byte []作为参数的构造函数。要发送数据包,请调用ToBytes()并将结果放入UDP数据包。

在ToBytes()方法中,创建一个12字节的字节数组,以及每个CSRC额外的4个字节,加上音频有效负载中有很多字节。

您需要使用按位OR运算符设置的单个位值。例如,标记位是第二个字节的第一位,因此要设置它:

if(marker)
{
    bytes[1] = bytes[1] | 0x80;  //0x80 is 1000 0000
}

要设置整数或短整的值,您需要将值转换为网络顺序(bigendian)字节数组,然后使用arraycopy将其设置在缓冲区中。我将让您了解如何创建网络顺序字节数组。

对于采用byte []的构造函数,您需要反向执行上述过程。要检查单个位的值,请使用AND运算符,例如:

marker = bytes[1] & 0x80 == 1;

无论是在这个类还是帮助器类中,您可能都需要方法来帮助根据数据包计数和采样率设置时间戳。例如,如果有效载荷是G.711,则为8000个样本/秒,这意味着每20ms发送一个包含160字节有效载荷的数据包,因此每个数据包的时间戳将增加160。