关于Java:如何在不使用API??的情况下制作音频RTP数据包以及RTP数据包的传输和拆包

How to make an audio RTP packet without using API along with the transmission and unpacking of the RTP packet

我是VoIP的新手。我想知道创建一个使用RTP使用Client / Server体系结构流音频的应用程序。提供了不同的API,但我需要在核心级别上有所了解。我研究了RFC。有人可以建议我如何制作音频RTP数据包并将其与JAVA中数据包的解压缩一起发送到服务器。
预先感谢。


创建一个空的Java类。

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

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

在您的ToBytes()方法中,创建一个12字节的字节数组,再为每个CSRC额外增加4个字节,再加上音频有效载荷中有许多字节。

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

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

要设置整数或缩写值,您需要将其转换为网络顺序(双字节)字节数组,然后使用arraycopy将其设置在缓冲区中。我将由您自己决定如何创建网络顺序字节数组。

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

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

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