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

时间:2015-01-17 21:49:36

标签: audio-streaming vlc wireshark shoutcast internet-radio

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

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

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

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

我第一次尝试做我想要的是在CentOS 6上编译VLC Media Player的源代码,所以我可以根据他们的New Title=调试语句简单地写出相应的字符串(例如{{1} }})到一个文件。不幸的是我无法获得编译的源代码。

未能在CentOS下编译VLC Media Player后,我转而使用Wireshark检查TCP流。使用查找,我可以从捕获的数据包中找到'Van Morrison - Born To Sing: No Plan B (2012) - Retreat and View'信息,但我无法弄清楚如何提取 - &实时,持续地保存它(例如,24x7)。

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

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

StreamTitle=

1 个答案:

答案 0 :(得分: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