我编写了一个程序,该程序可以从网络实时获取SIP数据包,并且我想使用数据包中嵌入的SDP信息来捕获来自两个VOIP软电话的音频对话。
一旦我从RTP协议中检索了二进制数据,应该如何将其转换为声音文件?
首选c ++。
答案 0 :(得分:0)
Adrian,您好,
是的,我们不能将 RTP 有效负载直接放置在一个接一个的文件中,然后再将该文件读取为音频文件,例如".wav"
。
您正在寻找的缺失部分是一段代码,它将rtp数据包流重新组合,解码和播放为语音样本;为了简单起见,请考虑众所周知的G.711
或PCM
编解码器,因为所有SIP电话都支持此编解码器。
您需要实现一个Playout buffer
(从逻辑上讲是一个无限缓冲区,但是可以环绕的环形缓冲区是可以的。)
数据包本身包含20ms持续时间的有效载荷中的音频数据。每个音频数据块都带有一个RTP头,该头指示编码的类型(这与SDP信息有关,您对该部分有很好的了解)。
对于每个数据包:
对于G.711
,通常以每秒8000次的正确速率将8位值解码为16位样本;
从RTP头计算播出点,它是播出缓冲区数组中的索引。 考虑到基于RTP时间戳的抖动和重新排序
将样本写入.wav
或将其播放到音频设备。
从务实的角度来看,您可以通过几种方式来做到这一点:
wireshark
进行艰苦的工作; 答案 1 :(得分:0)
如果仅从音频记录的角度出发
(.wav文件-通话中使用的音频编解码器是a-law / u-law)
您无需编码即可采用这种方法。
使用Wireshark捕获网络数据包(在pcap文件中)
Wireshark->电话->流分析
在Stream Analysis窗口中->保存(下拉菜单-选择“正向/反向流音频”)
以.raw文件格式保存。
以Audacity打开.raw文件格式,并将其转换为.wav文件。
我希望它能对您有所帮助。