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

Java 如何在不使用API的情况下制作音频RTP包以及RTP包的传输和解包,java,voip,rtp,Java,Voip,Rtp,我是网络电话新手。我想知道如何创建一个应用程序,使用RTP,使用客户机/服务器架构来流式传输音频。不同的API可用,但我需要在核心层面上获得理解。我学过RFC。有谁能建议我如何制作音频RTP数据包,并将其与JAVA中的数据包解包一起发送到服务器。 提前感谢。创建一个空Java类 为RTP标头中的所有字段添加成员。对单位字段使用bool。对于数字字段,您需要注意需要多少位,即使用int表示SSRC,时间戳表示序列,字节表示有效负载类型等。CSC应该是int的数组(或arrayList或其他任何形式

我是网络电话新手。我想知道如何创建一个应用程序,使用RTP,使用客户机/服务器架构来流式传输音频。不同的API可用,但我需要在核心层面上获得理解。我学过RFC。有谁能建议我如何制作音频RTP数据包,并将其与JAVA中的数据包解包一起发送到服务器。
提前感谢。

创建一个空Java类

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

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

在ToBytes()方法中,创建一个12字节的字节数组,每个字节再加上4个字节,再加上音频负载中的字节数

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

if(marker)
{
    bytes[1] = bytes[1] | 0x80;  //0x80 is 1000 0000
}
要设置int或shorts值,需要将该值转换为网络顺序(bigendian)字节数组,然后使用arraycopy在缓冲区中进行设置。如何创建网络顺序字节数组将由您决定

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

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

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

我已经成功实现了它。如果有人想要我的代码,请通过电子邮件与我联系。suleman748@gmail.com