Skip to content
Wireshark Wiki 中文翻译整理专题首页原始页面

RTP 统计

保存 RTP 音频流

支持 8000 Hz 采样率的编解码器

可以直接从 Wireshark 将 RTP 音频流的内容保存为 Au 文件。这是在 "RTP Stream Analysis" 对话框中完成的:按下 "Save" 按钮并选择其中一个 '... Audio' 选项,然后选择 'Sun Audio' 文件格式。

选择一个 RTP 流时,会生成单声道音频文件。选择两个 RTP 流时,会生成立体声音频文件。

RTP 流可以从数据包捕获的开头开始,但通常会稍后开始,例如在呼叫信令之后。出于同样原因,正向和反向流可能在不同时间开始。保存两个 RTP 流时,你可以选择三种方式,决定如何将捕获中的音频流写入文件中的音频流:

  • File synchronized - 保存的音频从捕获开始处开始;两个流都会在前面补静音,使其从捕获开始处开始。第二个流会被延迟,以保持其相对于第一个流的正确时间关系,因此两个流是同步的。
  • Stream synchronized - 保存的音频从第一个流的开头开始。第一个流从音频文件的开头开始;第二个流会被延迟,以保持其相对于第一个流的正确时间关系,因此两个流是同步的。
  • Unsynchronized - 两个流都从音频文件的开头开始,两个流之间的时间关系会被破坏。

注意:波形是用 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 会话效果很好)。

G.729

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。

G.723.1

同样,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 流分析

如果你想分析 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

带宽(BW)的计算方式

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

原始页面图片

audio_save_menu.png
audio_save_menu.png
save_audio_options.png
save_audio_options.png
openrtpsession.png
openrtpsession.png
RTP_graph_analysis2.gif
RTP_graph_analysis2.gif

相关 Wireshark Wiki 页面

网络分析技术档案