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

Posted

技术标签:

【中文标题】如何将字节数组转换为音频文件?【英文标题】:How to convert byte array to audio file? 【发布时间】:2019-12-27 00:33:48 【问题描述】:

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

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

首选c++。

【问题讨论】:

您好,新的贡献者!很高兴认识你! SDP 是 Session Description ,这意味着它描述了您正在查看的数据类型,对于音频数据,最好查看 RTP 或 SRTP(实时传输协议/安全实时传输协议)。所以从 SDP 你可以得到如何从 RTP 读取数据,比如网络加密。为了帮助你更多,我需要一个***.com/help/minimal-reproducible-example 没错,举个例子会有很大帮助。关于您的问题,这取决于您接收的音频数据的类型,SDP 应描述类型和其他信息,如采样率、样本大小等。确定音频类型后,您需要遵循 RTP 规范来形成帧出 RTP 数据包。 您好,感谢您的友好回复。我会尽快提供一些实际代码作为示例。解析来自网络的 sip 数据包的类非常大,所以我将尝试总结一下:它使用正则表达式从数据包中提取所有信息,因此获取所需的 rtp 信息将没有问题。我计划将 rtp 端口输入嗅探器(我正在使用 libtins 库)。然后,这个嗅探器将为我提供一个应该包含音频交换的字节缓冲区,至少我是这么认为的,所以我需要把它变成一个音频文件。 如果我已经可以解析 sdp 数据包中的信息并获得采样率、大小和其他参数(不确定是哪个,我的信号处理技能有点笨),我该怎么做将该信息与字节缓冲区一起转换为我可以收听的内容。 【参考方案1】:

嗨,阿德里安,欢迎,

你是对的,我们不能直接将 RTP 载荷放在一个接一个的文件中,然后将该文件作为音频文件读取,比如".wav"

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

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

对于每个数据包:

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

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

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

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

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

【讨论】:

感谢您为我指明了正确的方向。先生,祝你好日子 不客气,请不要忘记接受答案。【参考方案2】:

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

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

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

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

Wireshark-> 电话 -> 流分析

在流分析窗口中 -> 保存(下拉菜单 - 选择正向/反向流音频)

将其保存为 .raw 文件格式。

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

希望对你有帮助。

【讨论】:

以上是关于如何将字节数组转换为音频文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确将 16Bit 字节数组转换为音频剪辑数据?

在matlab中将音频文件转换为字节数组

有没有办法在android studio中将音频文件转换为字节数组

在 Windows 8 应用程序中转换字节数组以产生不同的音频声音

将短数组从音频记录转换为字节数组而不降低音频质量?

将 32 位浮点音频转换为 16 位字节数组?