如何在不使用 API 的情况下制作音频 RTP 数据包以及 RTP 数据包的传输和解包
How to make an audio RTP packet without using API along with the transmission and unpacking of the RTP packet
我是 VoIP 新手。我想创建一个使用 Client/Server 架构使用 RTP 流式传输音频的应用程序。可以使用不同的 API ,但是 我需要在核心级别上进行理解。我研究过RFC。任何人都可以建议我如何制作一个 音频 RTP 数据包 并将其发送到服务器以及 JAVA 中的数据包解包.
提前致谢。
创建空 Java class.
为 RTP header 中的所有字段添加成员。将 bool 用于单个位字段。对于数字字段,您需要注意您需要多少位,即 SSRC 使用 int,时间戳,序列的缩写,有效负载类型的字节等。CSRC 应该是一个数组(或 arrayList 或其他)的整数.音频负载应该是一个字节数组。
数据包只是字节数组,因此您需要一个 ToBytes() 方法来输出一个数据包 byte[],以及一个以 byte[] 作为参数的构造函数。要发送数据包,请调用 ToBytes() 并将结果放入 UDP 数据包中。
在您的 ToBytes() 方法中,创建一个 12 字节的字节数组,再加上每个 CSRC 的额外 4 个字节,再加上您的音频负载中的字节数。
您需要使用按位或运算符设置的单个位值。比如Marker位是第二个字节的第一个位,那么要设置:
if(marker)
{
bytes[1] = bytes[1] | 0x80; //0x80 is 1000 0000
}
要设置整数或短整型值,您需要将值转换为网络顺序 (bigendian) 字节数组,然后使用 arraycopy 将其设置在缓冲区中。我将留给您找出如何创建网络订单字节数组。
对于带byte[]的构造函数,需要将上述过程反向进行。要检查单个位的值,请使用 AND 运算符,例如:
marker = bytes[1] & 0x80 == 1;
在这个 class 或助手 class 中,您可能需要一些方法来帮助根据数据包计数和采样率设置时间戳。例如payload为G.711,则为8000samples/second,表示每20ms发送一个packet,payload为160byte,所以timestamp每包增加160
我是 VoIP 新手。我想创建一个使用 Client/Server 架构使用 RTP 流式传输音频的应用程序。可以使用不同的 API ,但是 我需要在核心级别上进行理解。我研究过RFC。任何人都可以建议我如何制作一个 音频 RTP 数据包 并将其发送到服务器以及 JAVA 中的数据包解包. 提前致谢。
创建空 Java class.
为 RTP header 中的所有字段添加成员。将 bool 用于单个位字段。对于数字字段,您需要注意您需要多少位,即 SSRC 使用 int,时间戳,序列的缩写,有效负载类型的字节等。CSRC 应该是一个数组(或 arrayList 或其他)的整数.音频负载应该是一个字节数组。
数据包只是字节数组,因此您需要一个 ToBytes() 方法来输出一个数据包 byte[],以及一个以 byte[] 作为参数的构造函数。要发送数据包,请调用 ToBytes() 并将结果放入 UDP 数据包中。
在您的 ToBytes() 方法中,创建一个 12 字节的字节数组,再加上每个 CSRC 的额外 4 个字节,再加上您的音频负载中的字节数。
您需要使用按位或运算符设置的单个位值。比如Marker位是第二个字节的第一个位,那么要设置:
if(marker)
{
bytes[1] = bytes[1] | 0x80; //0x80 is 1000 0000
}
要设置整数或短整型值,您需要将值转换为网络顺序 (bigendian) 字节数组,然后使用 arraycopy 将其设置在缓冲区中。我将留给您找出如何创建网络订单字节数组。
对于带byte[]的构造函数,需要将上述过程反向进行。要检查单个位的值,请使用 AND 运算符,例如:
marker = bytes[1] & 0x80 == 1;
在这个 class 或助手 class 中,您可能需要一些方法来帮助根据数据包计数和采样率设置时间戳。例如payload为G.711,则为8000samples/second,表示每20ms发送一个packet,payload为160byte,所以timestamp每包增加160