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

Audio 如何将字节数组转换为音频文件?,audio,voip,rtp,sdp,jain-sip,Audio,Voip,Rtp,Sdp,Jain Sip,我已经编写了一个程序,可以从网络中实时获取SIP数据包,我想使用数据包中嵌入的SDP信息来捕获来自两个VOIP软电话的音频对话 一旦我从RTP协议中检索到二进制数据,我应该如何将其转换成声音文件 c++优先。你好,阿德里安,欢迎光临 您是对的,我们不能直接将RTP有效负载一个接一个地连接在一个文件中,然后将此文件作为音频文件读取,比如说a“.wav” 您正在寻找的缺失部分是一段代码,它将数据包的rtp流重新组装、解码并播放到语音样本中;为了简单起见,考虑众所周知的 G.711或 PCM CODE

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

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


c++优先。

你好,阿德里安,欢迎光临

您是对的,我们不能直接将RTP有效负载一个接一个地连接在一个文件中,然后将此文件作为音频文件读取,比如说a
“.wav”

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

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

对于每个数据包:

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

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

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

  • 从实用主义的角度来看,你可以通过几种方式做到这一点:

    • 您将所有UDP/RTP数据包收集到一个捕获文件中,并使用它来完成繁重的工作
    • 使用现有的工具,如
    • 为此,获取一个库或编写现有代码,但这不是一项容易的任务。例如,您可以考虑处理数据包丢失
    如果您的要求仅从音频录制的角度来看

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

    这种方法无需编码即可实现

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

    Wireshark->电话->流分析

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

    将其保存为.raw文件格式

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


    我希望它能帮助你

    嗨,新撰稿人!很高兴认识你!SDP是一种会话描述,这意味着它描述了您正在查看的数据类型,对于音频数据,最好查看RTP或SRTP(实时传输协议/安全实时传输协议)。因此,从SDP您可以了解如何从RTP读取数据,例如网络加密。为了给你更多的帮助,我需要一个正确的例子,一个很有帮助的例子。关于您的问题,这取决于您接收的音频数据的类型,SDP应描述类型和其他信息,如采样率、样本大小等。确定音频类型后,您需要遵循RTP规范以形成RTP数据包的帧。您好,感谢您的回复。我会尽快提供一些实际的代码作为示例。解析来自网络的sip数据包的类相当大,因此我将尝试总结:它使用正则表达式从数据包中提取所有信息,因此获取所需的rtp信息不会有问题。我计划将rtp端口输入嗅探器(我正在使用libtins库)。然后,这个嗅探器将为我提供一个字节缓冲区,该缓冲区应包含音频交换,至少我是这么认为的,因此我需要将其转换为音频文件。前提是我已经可以解析sdp数据包中的信息,并获得采样率、大小和其他参数(不确定是哪个,我的信号处理技能有点笨),我该如何将这些信息连同字节缓冲区一起转换成我能听到的内容。谢谢你为我指明了正确的方向。您好,先生。欢迎您,请不要忘记接受答案。