我已经捕获了三个不同的流作为带有元数据的 pcap 文件。如何流回 RTP/RTCP 流?
7 回答
如果我理解正确,你有 pcaps,但你想从他们那里得到 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
有关我正在使用的完整 shell 脚本的更多详细信息:http: //www.continuous-qa.com/2013/04/automated-verification-of-voip-audio.html
作为 SIPp sip 测试包的一部分,有一个专门用于此目的的工具。 http://sipp.sourceforge.net/doc/reference.html#PCAP+Play
(免责声明:我自己从未使用过它,虽然我确实使用过 SIPp 本身,并且非常喜欢它)
拿一个 pcap 并(我假设)重放它是一件很重要的事情;我知道没有任何软件包可以做到这一点。可以做到,但需要非常了解 SIP(我假设您使用的是 SIP)和 RTP。您还必须小心在正确的时间重播数据包,而不是尽可能快。
真正知道自己在做什么的人可以在 3-5 天内编写出这样的工具。
我也用这个把头撞在墙上一段时间......但是,我有一个解决方案。因此,首先,请确保您可以正确拨打软电话/电话……如果您可以使连接正常,那么其余的都还不错。
这是我的命令行:
sudo sipp -s [我的电话号码] [我的代理/软交换机的 ip] -sf /home/sipp-3.3/uac_pcap_g711.xml -m 2000 -mi [我的计算机发送负载的 ip] -d 1200 -trace_rtt -trace_err -stat_delimiter ,
所以我正在使用我自己的场景文件,但上面的参数应该适合你。这就是我对 SIPP 所做的事情:
须藤:为什么须藤?如果你不 sudo 这个,它不能创建发送音频/媒体所需的套接字。
mi: mi 指定您发送媒体的 IP... 我不需要指定端口。
d:我在暂停中增加了 1200 毫秒
trace_rtt 和 trace_err:我输出日志文件和性能报告
stat_delimiter:我更改默认值;至 ,
无论如何,这对我有用。
编辑:
另外,请注意,我以默认速率 (10CPS) 进行了 2000 次呼叫...您现在可能希望将其设为 -m 1 以便您可以验证它是否有效。它应该播放 pcap 音频,然后发送 DTMF。
在我完成这项工作后,我将这一切导入 Jenkins CI 并通过 Jenkins 作业调用 sipp,并将 csv 输出转换为可视图形,并在加载期间进行一些 tshark 捕获......全部通过 Jenkins......如果你重新感兴趣,请查看我的博客(在我的个人资料中提到)以了解有关如何设置这些内容的详细信息。
我如何流回 RTP/RTCP 流。
为了实现您的目标,有一个名为 rtpplay 的特定工具(免费):http ://www.cs.columbia.edu/irt/software/rtptools/
如果您只想重播/收听音频,您可以使用wireshark将RTP有效负载保存在原始音频文件中,然后您可以重新发送它(或使用音频编辑器收听),但如果您想重现确切的RTP/ RTCP流更复杂