【问题标题】:How To Extract RTP Packet Specific Fields From Wireshark Capture?如何从 Wireshark Capture 中提取 RTP 数据包特定字段?
【发布时间】:2014-03-22 07:17:47
【问题描述】:

我有一个 PCAPNG 文件,我需要从中获取 RTP 数据包。具体来说,我的一个 RTP 数据包看起来像......

第 N 帧:线上 X 字节...

  • 以太网 II,源:...
  • IPv4,源:...
  • TCP,源端口:rstp ...
  • RTSP 交错帧,通道:0x02,163 字节
  • 实时传输协议

...而我需要从每个数据包中得到的是...

  1. 来自 RTSP 交错帧的通道
  2. RTSP 交错帧的长度
  3. 来自 RTP 的有效负载

...使用这些数据,我将重新创建一个音频和视频文件,以从本地有效负载重新构建完整的视频(播放不是流式传输)。

我可以使用任一方法成功获取 RTP 数据包...

tshark -r my.pcap -R -T fields -e rtp.payload -w rtp.out

或者...

tshark -r my.pcap -R -T fields -e rtp.payload > rtp.out

...但我遇到的问题是第一种方法会保存我需要的所有内容,但由于某种原因,它会在奇怪的地方添加额外的数据(即不仅仅是 RTP 有效负载和 RTSP 交错帧内容)。 ..这使我无法编写程序来生成我需要测试的数据。我尝试使用几个正则表达式删除所有额外的数据,但是有太多不同的场景与其他有效场景重叠。

第二种方法将仅提供 RTP 有效负载,而没有我需要的交错属性(它会生成每个字节之间带有冒号的十六进制,但这很容易处理)。即使我可以再次调用以获取所有 RTSP 交错帧属性,我也需要通过使用分隔符/定界符识别每个数据包来组合 2 个输出,我想避免这种情况(我无法获得 tshark要么这样做......)。

我查看了 tshark 读取过滤器,它似乎应该能够完成我需要的操作,但到目前为止我还无法弄清楚。请注意,我这样做只是为了创建示例数据并编写格式化播放所需数据的逻辑。最终,我的一位同事将修改流式客户端以以适当的格式捕获数据(因此我可以简单地通过 ffmpeg 运行数据而无需修改它)。关于如何创建所需格式的任何想法?

【问题讨论】:

    标签: ffmpeg rtsp rtp tshark pcap-ng


    【解决方案1】:

    我遇到的问题是第一种方法会保存我需要的所有内容,但由于某种原因,它会在奇怪的地方添加额外的数据(即不仅仅是 RTP 有效负载和 RTSP 交错帧内容)

    第一种方法:

    tshark -r my.pcap -R -T fields -e rtp.payload -w rtp.out
    

    应该打印一个错误,因为-R 标志指定了一个“读取过滤器”,并且读取过滤器必须在-R 标志之后并且不能以- 开头(如果-R 之后的内容开始带有-,它被解释为另一个标志),因此该命令没有指定“读取过滤器”。

    如果你的意思是,例如,

    tshark -r my.pcap -R rtp -T fields -e rtp.payload -w rtp.out
    

    该命令使用-w 标志,它指定包含来自my.pcap原始数据包数据二进制 文件,可能由读取过滤器过滤,应该写入名称为-w 标志的参数的文件,因此该命令的意思是“将my.pcap 中的所有RTP 数据包写入rtp.out 文件,同时写入rtp.payload 字段每个数据包到标准输出”。不幸的是,TShark 中存在一个错误,该错误将rtp.payload 字段的输出抑制到标准输出;我刚刚签入了一个错误修复。

    所以如果你想将字段写入文件,你必须重定向标准输出,所以你的second方法是正确的。

    我查看了 tshark 读取过滤器,它似乎应该能够做我需要的事情

    没有。读取过滤器仅控制 TShark 在读取捕获文件时会费心处理哪些数据包,而不是在解析后丢弃。

    你想要的是旗帜

    -e rtsp.channel -e rtsp.length
    

    但不幸的是,这些仅受当前 1.11.x 开发版本的 Wireshark 支持,受 1.10.x 或更早版本支持。我不知道哪些 1.11.x 版本支持它们;夜间构建将支持它们。

    【讨论】:

    • 非常感谢!你是对的,我的意思是“-R rtp”(实际上......因为我没有做双通道(-2 标志),我实际上的意思是“-Y rtp”)。我将我的 WireShark 升级到最新的开发版本并运行命令“tshark -r rtp_rtsp_Capture.pcapng -Y rtp -T fields -e rtsp.channel -e rtsp.length -e rtp.payload > rtp.out”,它可以工作!
    【解决方案2】:

    你可以尝试在安装rtp工具http://www.cs.columbia.edu/irt/software/rtptools后用wireshark将RTP payload保存为rtpdump格式

    这是在“RTP 流”(电话->RTP->显示所有流)对话框中通过按选定流上的“另存为”按钮完成的。

    更多信息可以查看http://wiki.wireshark.org/rtpdump

    【讨论】:

      猜你喜欢
      • 2022-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 2017-04-06
      • 2015-02-06
      • 1970-01-01
      相关资源
      最近更新 更多