如何将字节数组转换为音频文件?

How to convert byte array to audio file?

我编写了一个从网络实时获取SIP数据包的程序,我想使用数据包中嵌入的SDP信息来捕获两个VOIP软电话的音频对话。

一旦我从 RTP 协议中检索到二进制数据,我应该如何将其转换为声音文件?

首选c++。

嗨,阿德里安,欢迎,

你说得对,我们不能直接把RTP payload放在一个接一个的文件中,然后把这个文件当成音频文件来读,比方说一个".wav".

您正在寻找的缺失部分是一段代码,该代码重新assemble,将数据包的 rtp 流解码并播放为语音样本;为了简单起见,考虑众所周知的 G.711PCM 编解码器,因为所有 SIP phone 都支持此编解码器。 您需要实现一个 Playout buffer(逻辑上是一个无限缓冲区,但可以环绕的环形缓冲区)。

数据包本身包含持续时间为 20 毫秒的小负载的音频数据。每块音频数据前面都有一个RTP头,表示编码的类型(这与SDP信息有关,你对那部分有很好的理解)。

对于每个数据包:

  1. 以正确的速率将 8 位值解码为 16 位样本,通常每秒 8,000 次 G.711;

  2. 从RTP头计算出播放点,它是播放缓冲区数组中的索引。 根据 RTP 时间戳考虑抖动和重新排序

  3. 将示例写入 .wav 或在音频设备上播放。

从实用的角度来看,您可以通过以下几种方式做到这一点:

  • 您将所有 UDP/RTP 数据包收集到一个捕获文件中,并使用 wireshark 完成艰苦的工作;
  • 使用现有工具,例如 playSIP A command-line SIP session recorder
  • 为此目的获取库或编写现有代码,但这不是一件容易的事。例如,您可以考虑处理数据包丢失。

如果您的需求只是从录音的角度来看

( .wav 文件 - 通话中使用的音频编解码器是 a-law /u-law)

无需编码即可采用这种方法。

使用Wireshark抓包(在pcap文件中)

Wireshark-> 电话 -> 流分析

在流分析中 windows -> 保存(下拉菜单 - select Forward/reverse 流音频)

以 .raw 文件格式保存。

在 Audacity 中打开 .raw 文件格式并将其转换为 .wav 文件。

希望对你有所帮助。