Appearance
Appearance
可以直接从 Wireshark 将 RTP 音频流的内容保存为 Au 文件。这是在 "RTP Stream Analysis" 对话框中完成的:按下 "Save" 按钮并选择其中一个 '... Audio' 选项,然后选择 'Sun Audio' 文件格式。
选择一个 RTP 流时,会生成单声道音频文件。选择两个 RTP 流时,会生成立体声音频文件。
RTP 流可以从数据包捕获的开头开始,但通常会稍后开始,例如在呼叫信令之后。出于同样原因,正向和反向流可能在不同时间开始。保存两个 RTP 流时,你可以选择三种方式,决定如何将捕获中的音频流写入文件中的音频流:
注意:波形是用 audacity 采集并用 gimp 合成的。
Wireshark 3.2.0 之前只能保存 G.711 编解码器的音频。Wireshark 3.2.0 及更高版本可以保存任何受支持且采样率为 8000 Hz 的编解码器音频。
此外,从 Wireshark 0.99.4 开始,可以在 Wireshark 内收听 RTP 流。参见 VoIP_calls。
对于任何编解码器(音频和视频),都可以保存为 rtpdump 格式,并使用例如 rtptools 中的 rtplay 程序,将 RTP 流重放到 JMF JMstudio、Apple QuickTime player 以及类似程序,只要它们支持该编解码器即可。但遗憾的是,这些程序不支持 G.729(可能是因为 G.729 的许可费用较高)。
下面是一个小示例:
安装 JMF(包含 JMstudio)
下载 rtptools
用 Wireshark 打开 RTP 捕获文件
选择合适的 UDP,并强制将其解码为 RTP:菜单 Analyze >> Decode As... RTP。
菜单 Statistics(Wireshark 1.0)或 Telephony >> RTP >> Show all streams。选择你感兴趣的那个流,按下 Save 按钮,为单个(正向或反向)流选择其中一个 '... Audio' 选项,然后选择 'Raw' 格式文件。
启动 JMstudio
菜单 File >> Open RTP Session,并输入你的本地 IP 地址(对我来说 127.0.0.1 不起作用),如下所示:
按下 "Open" 按钮——现在 JMstudio 会等待该流
打开终端并输入:
user@host$ rtpplay -T -f /path/to/your/captured.rtpdump 192.168.0.23/1234现在你应该能听到捕获到的内容。**注意:**JMstudio 并不支持所有编解码器,但支持一些 RTP 常用编解码器(对我来说,用 GSM 作为编解码器收听捕获的 kphone 会话效果很好)。
ITU-T 包含用于在 PCM 音频(G.729 bitstream 格式)与 PCM 之间转换的软件例程。如果你购买了此类软件包,就可以编译解码器,从 G.729 bitstream 中提取 PCM 音频。这个 G.729AB bitstream 相当繁琐(G.729AB 数据包由多个语音或静音块组成;在 ITU-T 例程中,每个块都由前导同步模式标识;此外,payload 中的每一位都必须编码为一个 16-bit long word),因此需要一个修改版 rtpdump,才能从 Wireshark 生成的 rtpdump 文件中提取 G.729AB bitstream;下载 rtpdump 1.18 版本的源代码,应用补丁 rtpdump.c.1.18.patch,编译并按照以下步骤操作:
用 Wireshark 打开 RTP 捕获文件
选择合适的 UDP,并强制将其解码为 RTP:菜单 Analyze >> Decode As... RTP。
使用显示过滤器 rtp.p_type==18 过滤 G.729AB payload。
菜单 Statistics(Wireshark 1.0)或 Telephony >> RTP >> Show all streams。选择你感兴趣的 G.729 流,按下 Save 按钮,为单个(正向或反向)流选择其中一个 '... Audio' 选项,然后选择 'Raw' 格式文件。
rtpdump -F itut -f file.rtpdump -o file.rtp
decoder file.rtp file.pcm
在 Goldwave 或 Audacity(例如)中将 file.pcm 导入为 16 bit signed mono,采样率为 8000 Hz。
rtpdump 的 "itut" 标志是新增的,用于允许按上述 ITU-T G.729AB 格式解码 rtpdump。
同样,ITU-T 包含用于在 PCM 音频与 G.723.1 格式之间转换的软件例程。幸运的是,ITU-T 软件例程 "lbccodec" 所期望的 bitstream 格式比上面 G.729AB 的情况更简单,因此 rtpdump 程序可以直接配合 "payload" 标志使用:
用 Wireshark 打开捕获文件。
菜单 Analyze >> Decode As... RTP。
使用显示过滤器 rtp.p_type==8 过滤 G.723.1 payload。
菜单 Statistics(Wireshark 1.0)或 Telephony >> RTP >> Show all streams。选择你感兴趣的 G.723.1 流,按下 Save 按钮,为单个(正向或反向)流选择其中一个 '... Audio' 选项,然后选择 'Raw' 格式文件。
rtpdump -F payload -f file.rtpdump -o file.rtp
lbccodec -d file.rtp file.pcm
在 Goldwave 中将 file.pcm 导入为 16 bit signed mono,采样率为 8000 Hz:
你可以在 "RTP streams" 对话框中选择该流并按下 "Save As " 按钮,将 RTP 流保存为 rtpdump 格式。
如果你想分析 RTP 流,有两种方法可以选择要分析的流:
使用菜单项 Statistics(Wireshark 1.0)或 Telephony >> RTP >> Show All Streams...,并在随后的 "RTP Streams" 对话框中选择一个流
在 Packet List Pane 中选择一个 RTP 数据包,并使用 Statistics(Wireshark 1.0)或 Telephony >> RTP >> Stream Analysis...
……两种方法都会打开同一个 "RTP Stream Analysis" 对话框。
你可以获得该 RTP 流的延迟、抖动、带宽等信息。也可以获得诸如丢包、最大延迟和序列错误等一般统计信息。使用 "Graph" 按钮可以查看随时间变化的抖动和数据包之间的差值。
Wireshark 根据 RFC3550(RTP)计算抖动:
如果 Si 是数据包 i 的 RTP timestamp,Ri 是以 RTP timestamp 单位表示的数据包 i 到达时间,那么对于两个数据包 i 和 j,D 可以表示为
D(i,j) = (Rj - Ri) - (Sj - Si) = (Rj - Sj) - (Ri - Si)
interarrival jitter 应在从源 SSRC_n 接收到每个数据包 i 时连续计算,使用该数据包与到达顺序中前一个数据包 i-1(不一定按序列号顺序)之间的差值 D,并按照公式
J(i) = J(i-1) + (|D(i-1,i)| - J(i-1))/16
RTP timestamp:RTP timestamp 基于编解码器的采样频率,大多数音频编解码器为 8000,大多数视频编解码器为 90000。由于必须知道采样频率才能正确计算抖动,因此对 dynamic payload types 进行抖动计算会有问题,因为必须知道编解码器及其采样频率,这意味着会话的设置信息必须在 trace 中,并且程序必须知道所使用的编解码器(以当前实现而言)。
有时间投入的开发者可以修改当前实现,使其也在 SDP 数据中记录采样频率,并将其添加到 RTP conversation 数据中,然后在 RTP 分析中使用。
示例:
SampleCaptures:SIP 和 RTP 文件:aaa.pcap,流:SSRC = 932629361 (0x3796CB71)
这是数据包中已有且将在公式中使用的内容:
R0 = frame 624: frame.time = Jul 4, 2005 11:56:25.348411000
S0 = frame 624: rtp.timestamp = 1240
R1 = frame 625: frame.time = Jul 4, 2005 11:56:25.418358000
S1 = frame 625: rtp.timestamp = 1400
R2 = frame 626: frame.time = Jul 4, 2005 11:56:25.421891000
S2 = frame 626: rtp.timestamp = 1560
我们还知道 rtp.p_type = ITU-T G.711 PCMA (8),因此知道采样时钟为 8000Hz,也就是说 rtp.timestamp 的单位为 1/8000 sec = 0.000125 sec。
现在进行计算:
frame 624:
J(0) = 0
frame 625:
D(0,1) = (R1 - R0) - (S1 - S0)
= [以秒为单位] (.418358000 sec - .348411000 sec) - (1400 * 0.000125 sec - 1240 * 0.000125 sec) = 0.049947
J(1) = J(0) + (|D(0,1)| - J(0))/16
= [以秒为单位] 0 + (|0.049947| - 0)/16 = 0.0031216875
frame 626:
D(1,2) = (R2 - R1) - (S2 - S1)
= [以秒为单位] (.421891000 sec - .418358000 sec) - (1560 * 0.000125 sec - 1400 * 0.000125 sec) = -0.016467
J(2) = J(1) + (|D(1,2)| - J(1))/16
= [以秒为单位] 0.0031216875 + (|-0.016467| - 0.0031216875)/16 = 0.00395576953125
RTP Streams 和 RTP Statistics 对话框中的 BW 列显示给定 RTP 流在 IP 层的带宽。它是给定 RTP 流在最后一秒内所有数据包中所有 octet 的总和,包括 IP 和 UDP 头部(20+8 字节)。
更多详细信息,请参见文件 tap-rtp-common.c 中的函数 rtp_packet_analyse。
Imported from https://wiki.wireshark.org/RTP_statistics on 2020-08-11 23:24:14 UTC