使用mplayer从音频流中提取冰冷的元数据(连续)



我需要从实时音频流中提取ICY元数据,并考虑使用mplayer来实现这一点,因为它在播放音频流时会输出元数据。我对其他方法持开放态度,目标是将更新后的元数据(歌曲信息(保存到一个文本文件中,该文件将在歌曲(或数据(更改时更新。

我想使用mplayer的原因之一是确保它能在最多样化的流上工作(而不仅仅是Shoutcast/Icecast(。

我现在可以使用以下简单的行提取元数据:mplayerhttp://streamurl

问题是,我不想每x秒调用一次它,因为它会用x秒的调用(连接/断开连接(填充目标服务器日志。

我宁愿让它永久连接到流,并在歌曲更新时使用mplayer的输出来输出冰冷的元数据。

我不想每x秒连接一次,因为我需要相当大的粒度,并且会每10-15秒检查一次更新。

我很乐意用另一种方式来做这件事,但最终需要以某种方式将数据输出到.txt文件中。

任何关于如何实现这一目标的建议都将不胜感激。

我所做的是在线程中运行它并捕获它的输出。这样,您就可以对它做任何您想做的事情:例如,调用一个函数来更新一个变量。

例如:

class Radio:
radio = None
stream_text = None
t1 = None
def __init__(self, radio):
self.radio = radio
def getText(self):
if self.stream_text:
return self.stream_text
return ""
def setURL (self,radio):
self.radio = radio
def run(self):
self.t1 = threading.Thread(target=self.start)
self.t1.start()
def start(self):
self.p= subprocess.Popen(['mplayer','-slave','-quiet', self.radio], stdin=subprocess.PIPE, stdout=subprocess.PIPE,universal_newlines=True, bufsize = 1)
for line in self.p.stdout:
if line.encode('utf-8').startswith(b'ICY Info:'):
info = line.split(':', 1)[1].strip()
attrs = dict(re.findall("(w+)='([^']*)'", info))
self.stream_text = attrs.get('StreamTitle', '(none)')

通过每秒调用getText(),我可以获得最新信息,但当然,您可以发送一个回调函数,以便在每次新更新时执行。

相关内容

  • 没有找到相关文章

最新更新