【问题标题】:Audio Stream using Python/Tornado to act a "radio"音频流使用 Python/Tornado 充当“收音机”
【发布时间】:2013-06-01 22:58:36
【问题描述】:

我正在用 Python 创建一个小项目,它使用 Tornado 托管一个 RESTful API,用于检索、搜索和添加音频文件。到目前为止,我可以通过

输出音频文件
self.set_header('Content-type', mimeType)
self.write(open(fileName).read())

但是,我希望能够创建一个“广播”电台。它实际上只是一个美化的播放列表,但我希望它可以在多台计算机之间同步。
我计划让每个电台将其即将播放的曲目写入文件/数据库,当一首歌曲的输入流完成时,它将开始输出下一首歌曲。如果一个不存在,它只会停止流。暂停流的能力将是一个奖励,但此时我只想让流启动并运行。

我环顾四周,我只能找到 GStreamer(它有一个 Python 端口,但我无法让它在 Mac 上工作)和奇怪的不完整/旧/废弃的项目。我知道 SHOUTcast 协议,但我不太确定如何以“广播电台”风格流式传输音频。

我是 Python 编程的新手(我主要使用 PHP),所以也许我只是没有在正确的地方寻找或寻找正确的东西?

感谢您的帮助!

【问题讨论】:

  • “电台”通常意味着服务器处理播放列表,一次播放一首歌曲;任何连接的客户都会在当前歌曲的中间加入。如果这是您想要的,GStreamer、icecast/SHOUTcast 等非常适合您(尽管您可能想要考虑 HTML5 AV 流媒体)。但是如果你想发送一个每个客户端都从头开始的播放列表,只需发送一个播放列表(例如,一个完整的 MP3 URL 文件)并在客户端解析它。
  • 我确实计划提供可供下载/修改等的播放列表,但我会看看你提到的流媒体选项(尽管如前所述,我无法让 GStreamer 工作),谢谢!
  • 但是您希望每个新客户端从播放列表的顶部开始,还是从当前曲目开始?对于后者,您需要广播式流媒体;对于前者,你不需要;只需提供客户端 URL 即可下载和播放。 (如果您担心隐藏下载 URL 以防止盗版……好吧,这实际上是不可能的,但是 RIAA 已经隐含地认为目前使用的一些半途而废的解决方案已经足够好了,所以您可能想要使用其中一个而不是发明新的东西,即使它更好......)
  • 每个客户端都应该从当前曲目中的当前时间戳开始,就像收音机一样。幸运的是盗版不会成为问题,因为这仅供内部使用,但我有兴趣寻找帮助防止盗版的方法

标签: python streaming tornado gstreamer


【解决方案1】:

现在我(想我)明白你想要什么,我认为最简单的开始方法是这样的:

首先,设置一个 stock icecast 服务器。现在,只需将其作为手动配置的独立守护程序运行即可。

接下来,设置一个 stock ices 或类似的源客户端,它只流式传输您通过服务器提供的播放列表。同样,现在,手动配置和运行它。

接下来,编写一个 Tornado 服务器,为客户端提供您想要的任何 UI、元数据和/或流地址。

您可以编写自定义客户端,也可以只提供“广播播放列表”.m3u 文件,这些文件将在用户的默认播放器中打开。 (这只是一个文件,其中包含指向 icecast 流地址的 URL。在大多数媒体播放器中播放此 .m3u 将从给定的 URL 流式传输,这只是通过 HTTP 提供无限长的 MP3 文件。)

您可能想要在此基础上添加的大部分内容都将与源客户端进行交互。例如,您想要保留曲目数据库并动态生成播放列表。您可能希望最终用户能够添加或编辑数据库。等等。根据您想要获得的花哨程度,您可能只想通过修改其输入文件并将其作为子进程 (subprocess.Popen) 运行来驱动 ices,以便您可以轻松启动和停止实例,或者您可能想要编写自定义围绕shout-python从头开始的源客户端。

如果您还需要控制服务器,您可以类似地通过编辑其配置文件并将其作为子进程运行来驱动它。

【讨论】:

  • 我想使用 Tornado 服务器通过 RESTful API 控制 icecast 服务器,所以我将尝试使用 shout-python 设置服务器。我目前正在使用该示例获得shout.ShoutException: Couldn't connect,但我已经安装了 libshout 和 say-python,所以我将不得不调试一段时间 :) 感谢所有帮助!
  • 听起来你把两个部分混在一起了。服务器 (icecast) 只是将源客户端的流重复到侦听器客户端。源客户端(ices,或您使用shout-python 构建的东西)连接到服务器并为其提供流。你需要两者。如果要更改播放列表、插入消息、暂停流等,这些都由源客户端完成。
  • 是的,我把 2 弄糊涂了。我将看看如何设置一个 icecast 服务器并首先使用ices,然后尝试使用shout-python 构建我的系统。感谢大家的帮助!
猜你喜欢
  • 2013-02-12
  • 2013-08-20
  • 2015-02-07
  • 1970-01-01
  • 2021-09-20
  • 2021-10-16
  • 1970-01-01
  • 2017-10-20
  • 2011-12-21
相关资源
最近更新 更多