【问题标题】:Using mplayer to extract icy metadata from audio stream (continuously)使用 mplayer 从音频流中提取冰冷的元数据(连续)
【发布时间】:2020-04-17 13:50:30
【问题描述】:

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

我想使用 mplayer 的原因之一是确保它适用于最多样化的可用流(而不仅仅是 Shoutcast/Icecast)。

我现在可以使用这个简单的行来提取元数据:mplayer http://streamurl

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

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

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

我很乐意以不同的方式执行此操作,但最终需要以某种方式将数据输出到 .txt 文件中。

任何关于如何实现这一点的指针将不胜感激。

【问题讨论】:

    标签: audio streaming mplayer


    【解决方案1】:

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

    例如:

    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(),我可以获得最新信息,但当然,您可以发送一个回调函数,以便在每次新更新时执行。

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 2012-06-26
      • 2011-07-03
      • 2019-03-18
      • 2017-04-26
      • 2011-06-22
      相关资源
      最近更新 更多