如何使用 Wireshark 从网络音频流中提取 StreamTitle?

How to extract StreamTitle from network audio stream using Wireshark?

如何使用 Wireshark 实时(即连续地,而不是从捕获文件中)提取字符串,例如:

StreamTitle='The Rolling Stones - Black Box [Disc 3] (1970) - Bitch';

来自网络音频流(例如 http://50.7.76.250:8757/stream),并将此字符串附加到文件?

我想做的是从这个网络音频流制作一个实时播放列表,以便发布在网站上。

我第一次尝试做我想做的事情是在 CentOS 6 上编译 VLC 媒体播放器的源代码,这样我就可以根据他们的 New Title= 调试语句简单地编写相应的字符串(例如,'Van Morrison - Born To Sing: No Plan B (2012) - Retreat and View') 到一个文件。不幸的是我无法获得编译的源代码。

在无法让 VLC Media Player 在 CentOS 下编译后,我转而使用 Wireshark 来检查 TCP 流。使用 Find,我可以从捕获的数据包中找到 StreamTitle= 信息,但我不知道如何实时、连续地(例如 24x7)提取和保存它。

ETA:如果我必须编写代码来执行此操作,我会 Perl 和 C。

更新:我最终学到了足够的东西 Lua 来编写 VLC 脚本并获得我需要的东西:

function get_meta_now_playing()
  local inpt = vlc.object.input()
  if inpt == nil then
    return nil
  end
  local item = vlc.item or vlc.input.item()
  if not item then
    return nil
  else
    local metas = item:metas();
    local nwp   = metas["now_playing"]
    if nwp then
      return nwp
    else
      return nil
    end
  end
end

您正在查看的是一个混合了 SHOUTcast-style(通常称为 ICY)元数据的流。据我所知,没有用于对此进行多路分解的 Wireshark 过滤器。然而,问题比这更简单。

定期插入元数据。您甚至不需要 VLC 即可将其删除。如果您查看响应 headers,您会看到一个名为 Icy-MetaInt 的响应。这是元数据块的间隔(以字节为单位)。元数据块中的第一个字节是元数据块的长度除以 16。然后用空字节填充元数据块。

例如,假设元间隔为 8192 字节...

[8192 bytes of audio][1 byte meta length][meta block][8192 bytes of audio][etc...]

只需读取音频后的第一个字节,乘以 16,然后从元数据块的流中读取那么多字节。砍掉它末尾的空字节,你就有了你的数据。

更简单的是,StreamRipper 在其 STDERR 流上输出元数据。您可以将其通过管道传输到脚本中。

详情请看我的回答:https://whosebug.com/a/4914538/362536