3

如何使用 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')写入文件。不幸的是,我无法编译源代码。

在 CentOS 下无法编译 VLC 媒体播放器后,我转而使用 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
4

1 回答 1

1

您正在查看的是混入了 SHOUTcast 样式(通常称为 ICY)元数据的流。据我所知,没有 Wireshark 过滤器可用于解复用。然而,问题比这更简单。

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

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

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

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

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

有关更多详细信息,请在此处查看我的答案: https ://stackoverflow.com/a/4914538/362536

于 2015-01-18T21:56:38.113 回答