首页 > 解决方案 > 如何将 rtp 数据包有效负载字节转换为任何音频数据?

问题描述

我在不使用任何第三方库的情况下用 java 制作项目。我已经使用DatagramSocket. 然后我开始使用 sip 协议进行通信。我已经成功通过了注册和邀请阶段。这就是我获得音频数据流将被传输到的主机和端口的方式。然后我成功地建立了到新地址的连接使用DatagramSocket. 我开始以 rtp 数据包的形式接收数据。我成功地从包中获取了以下数据:有效负载类型(在我的情况下为 8 或 PCMA)、时间戳、序列号和有效负载数据(字节数组)。现在我想处理接收到的数据,以便将来可以使用它。即保存到磁盘,随意转换成任何其他音频格式,播放音频等等。我无法弄清楚从数据包中接收到的字节数组到底需要做什么。

假设首先我想将接收到的数据保存到AudioFormat.Encoding.PCM_FLOAT8000.0 Hz、8 位、单声道、160 字节/帧格式的文件中。我需要为此做些什么?

标签: javaudpsiprtp

解决方案


使用Aaron Clauson的示例,我解决了我的问题。必须根据建议的方案转换来自数据包的字节数组。我做了一个工作示例来说明这在 Kotlin 中的外观。

如何从原始 rtp 包中获取数据的示例。

如果您以正确的顺序 (by sequenceNumber) 粘合结果数组并且没有重复,那么例如,您可以使用 将其写入 WAV 文件javax.sound.sampled.AudioInputStream,如示例中所示。

一个关于如何在 Android 上实时播放声音流的简化示例。以及如何将声音从麦克风发送到服务器的简化示例。


推荐阅读