如何将字节数组转换为音频文件?
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.711
或PCM
编解码器,因为所有 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 文件。
希望对你有帮助。
【讨论】:
以上是关于如何将字节数组转换为音频文件?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在android studio中将音频文件转换为字节数组