gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:20:38 26 4
gpt4 key购买 nike

我需要从实时音频流中提取ICY元数据,并正在使用mplayer进行此操作,因为它在播放音频流时会输出元数据。我欢迎其他方式执行此操作,目标是将更新的元数据(歌曲信息)保存到文本文件中,只要歌曲(或数据)发生更改,该文件就会更新。

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

我现在可以使用以下简单行提取元数据:mplayer http://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(),我可以获得最新的信息,但是,当然,您可以发送一个回调函数来执行每个新更新,而不是通过这种方式进行更新。

关于audio - 使用mplayer从音频流中提取冰冷的元数据(连续),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61273264/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com