gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:21:45 26 4
gpt4 key购买 nike

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

最佳答案

创建一个空的 Java 类。

为 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
}

要设置 int 或 short 值,您需要将值转换为网络顺序 (bigendian) 字节数组,然后使用 arraycopy 将其设置在缓冲区中。我将留给您找出如何创建网络订单字节数组。

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

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

在此类或辅助类中,您可能需要一些方法来帮助根据数据包计数和采样率设置时间戳。例如,如果负载是G.711,它是8000 samples/second,这意味着每20ms发送一个数据包,负载为160字节,因此时间戳将每个数据包增加160。

关于java - 如何在不使用 API 的情况下制作音频 RTP 数据包以及 RTP 数据包的传输和解包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47681821/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com