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

时间:2019-08-21 17:27:08

标签: audio voip rtp sdp jain-sip

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

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

首选c ++。

2 个答案:

答案 0 :(得分:0)

Adrian,您好,

是的,我们不能将 RTP 有效负载直接放置在一个接一个的文件中,然后再将该文件读取为音频文件,例如".wav"

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

数据包本身包含20ms持续时间的有效载荷中的音频数据。每个音频数据块都带有一个RTP头,该头指示编码的类型(这与SDP信息有关,您对该部分有很好的了解)。

对于每个数据包:

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

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

  3. 将样本写入.wav或将其播放到音频设备。

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

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

答案 1 :(得分:0)

如果仅从音频记录的角度出发

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

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

使用Wireshark捕获网络数据包(在pcap文件中)

Wireshark->电话->流分析

在Stream Analysis窗口中->保存(下拉菜单-选择“正向/反向流音频”)

以.raw文件格式保存。

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

我希望它能对您有所帮助。