如果我理解正确的话,你有 pcap,但你想从他们那里得到 RTP 吗?
Wireshark 用户界面
您可以使用 Wireshark 的 UI 通过菜单轻松地从 pcap 获取 RTP:电话/RTP/,然后显示所有流...单击它列出的流,然后“分析”。
但是,如果您想自动化此操作并避免使用 UI...您可以使用 tshark。我在网上找到了几个教程,并使用它们构建了一个测试工具,可以自动在 pcap 上重建音频/rtp,然后制作一个 wav 并将该 wav 上的音频转录为文本。
使用 Tshark 实现自动化
我正在进行测试通话,想要将录制的 pcap 转换为音频。为此,我从 pcap 中剥离了 RTP,然后将 rtp 文件转换为原始音频,然后转换为 wav。
我通过命令行完成这一切,因此它可以自动化。所以我确实有一个 shell 脚本来执行此操作:
tshark -a duration:20 -w /jenkins/userContent/sip_1call.pcap
上面记录了 20 秒的数据包捕获(同时进行呼叫的持续时间),并将数据包输出为 sip_1call.pcap
ssrc=$(tshark -n -r /jenkins/userContent/sip_1call.pcap -R rtp -T fields -e rtp.ssrc -Eseparator=, | sort -u | awk 'FNR ==1 {print}')
我将变量 ssrc 设置为使用 tshark 提取 rtp ssrc 值的操作。 ssrc是什么,是RTP流的标识符。如果您有一个流,则您将拥有一个 RTP ssrc 值。您需要捕获所有 RTP.ssrc 并将它们输出到文件中,这样就可以轻松地再次变成原始音频。
sudo tshark -n -r /jenkins/userContent/sip_1call.pcap -R rtp -R "rtp.ssrc == $ssrc" -T fields -e rtp.payload | tee payloads
在我的 shell 脚本的这一点上,我在记录的 pcap 上再次运行 tshark 并获取该 ssrc 值并说“将它们全部查找为‘有效负载’”
for payload in `cat payloads`; do IFS=:; for byte in $payload; do printf "\\x$byte" >> /jenkins/userContent/sip_1call.raw; done; done
现在脚本将这些 RTP.ssrc 设置为输出文件,我正在调用 sip_1call.raw
出于我的目的,我还想将该原始文件转换为 wav,所以我使用了 sox:
sox -t raw -r 8000 -v 4 -c 1 -U /jenkins/userContent/sip_1call.raw /jenkins/userContent/sip_1call.wav
我在自动化框架中做了更多的事情(例如将音频转录为文本并与已知字符串进行比较)......但这超出了您的问题的范围。
我希望这有帮助...
有关 SSRc 的更多信息:http://en.wikipedia.org/wiki/Real-time_Transport_Protocol http://en.wikipedia.org/wiki/Real-time_Transport_Protocol
有关我正在使用的完整 shell 脚本的更多详细信息:http://www.continuous-qa.com/2013/04/automated-verification-of-voip-audio.html http://www.continuous-qa.com/2013/04/automated-verification-of-voip-audio.html