使用 Python 从无线电流中读取 SHOUTcast/Icecast 元数据
Posted
技术标签:
【中文标题】使用 Python 从无线电流中读取 SHOUTcast/Icecast 元数据【英文标题】:Reading SHOUTcast/Icecast metadata from a radio stream with Python 【发布时间】:2011-09-30 14:41:42 【问题描述】:有没有人成功地从远程无线电流中读取 SHOUTcast/Icecast 元数据?
several libraries 可以从本地 MP3 文件中读取元数据,但似乎没有一个设计用于处理无线电流(本质上是远程服务器上永无止境的 MP3 文件)。
其他建议建议从 mp3 流的开头下载有限数量的位,但这通常会导致一堆与文本元数据毫无相似之处的十六进制输出。
有人知道更成功的解决方案吗?谢谢。
【问题讨论】:
【参考方案1】:由于 mp3 是一种专有格式,因此规范并不容易获得。我认为This website 提供了一个很好的概述。
在普通的 mp3 文件中,ID3v1 元数据标签位于文件的最后,它构成了最后 128 个字节。这实际上是一个糟糕的设计。 ID3 系统是后来添加到 mp3 中的,所以我想在不破坏向后兼容性的情况下没有其他方法可以做到这一点。这意味着如果广播流像一个永无止境的 mp3 文件一样提供,那么通常意义上的 ID3 标记是不可能存在的。
我会与电台的经营者核实;也许他们把 ID3 标签放在了一个不标准的地方?
【讨论】:
感谢您的信息。我应该提到我正在尝试使用 Shoutcast/Icecast 和 Live365 流来做到这一点,它们很可能以某种方式标准化了它们的元数据格式,但我还没有找到它。 @jforberg Internet 广播流不使用 ID3 标签。 SHOUTcast/Icecast 风格的流使用交错到音频数据中的元数据。在接收端,这被拆分出来。【参考方案2】:#!/usr/bin/env python
import urllib2
stream_url = 'http://pub1.di.fm/di_classictrance'
request = urllib2.Request(stream_url)
try:
request.add_header('Icy-MetaData', 1)
response = urllib2.urlopen(request)
icy_metaint_header = response.headers.get('icy-metaint')
if icy_metaint_header is not None:
metaint = int(icy_metaint_header)
read_buffer = metaint+255
content = response.read(read_buffer)
title = content[metaint:].split("'")[1]
print title
except:
print 'Error'
更多详情请查看this link
【讨论】:
【参考方案3】:我使用了一些 @dbogdan 的代码,并创建了一个库,我每天使用超过 4000 个流。 它运行良好且稳定,支持歌曲标题、艺术家姓名、比特率和内容类型等元数据。
您可以在以下位置找到它 https://github.com/Dirble/streamscrobbler-python
【讨论】:
以上是关于使用 Python 从无线电流中读取 SHOUTcast/Icecast 元数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 HTML5 音频的无线电流混合 Android 应用程序的巨大延迟