12

我正在寻找一个 python 片段来读取互联网广播流(.asx、.pls 等)并将其保存到文件中。

最后一个项目是 cron'ed 脚本,它将录制一两个小时的互联网广播,然后将其传输到我的手机上,以便在我上下班途中播放。(3g 在我的通勤路上有点参差不齐)

欢迎任何snippits或指针。

4

5 回答 5

13

以下对我使用 requests 库来处理 http 请求有用。

import requests

stream_url = 'http://your-stream-source.com/stream'

r = requests.get(stream_url, stream=True)

with open('stream.mp3', 'wb') as f:
    try:
        for block in r.iter_content(1024):
            f.write(block)
    except KeyboardInterrupt:
        pass

这会将流保存到stream.mp3文件中,直到您使用ctrl+C.

于 2015-12-08T15:04:09.157 回答
7

因此,在修补和使用它之后,我发现Streamripper效果最好。这是我使用的命令

streamripper http://yp.shoutcast.com/sbin/tunein-station.pls?id=1377200 -d ./streams -l 10800 -a tb$FNAME
于 2011-03-28T22:33:48.387 回答
7

如果您发现 Python 3 中的请求或 urllib.request 调用无法保存流,因为您收到“ICY 200 OK”而不是“HTTP/1.0 200 OK”标头,您需要告诉底层函数 ICY 200好的是好的!

您可以有效地做的是在处理标头之前,在打开流之后拦截处理读取状态的例程。

只需将这样的例程放在您的流打开代码上方即可。

def NiceToICY(self):
    class InterceptedHTTPResponse():
        pass
    import io
    line = self.fp.readline().replace(b"ICY 200 OK\r\n", b"HTTP/1.0 200 OK\r\n")
    InterceptedSelf = InterceptedHTTPResponse()
    InterceptedSelf.fp = io.BufferedReader(io.BytesIO(line))
    InterceptedSelf.debuglevel = self.debuglevel
    InterceptedSelf._close_conn = self._close_conn
    return ORIGINAL_HTTP_CLIENT_READ_STATUS(InterceptedSelf)

然后在打开 URL 之前将这些行放在主程序的开头。

ORIGINAL_HTTP_CLIENT_READ_STATUS = urllib.request.http.client.HTTPResponse._read_status
urllib.request.http.client.HTTPResponse._read_status = NiceToICY

他们将覆盖标准例程(仅此一次)并在打开流时运行 NiceToICY 函数来代替正常状态检查。NiceToICY 替换无法识别的状态响应,然后复制“真实”_read_status 函数所需的原始响应的相关位。最后调用原始文件并将其中的值传递回调用者,其他一切都照常进行。

我发现这是解决导致错误的状态消息问题的最简单方法。希望它对你也有用。

于 2016-12-27T02:06:39.850 回答
3

我知道这是一岁了,但这仍然是一个可行的问题,我最近一直在摆弄。

大多数互联网广播电台都会为您提供下载类型的选项,我选择 MP3 版本,然后从原始套接字读取信息并将其写入文件。诀窍是计算出下载速度与播放歌曲相比的速度,以便您可以在读/写大小上取得平衡。这将在您的缓冲区定义中。

现在您有了文件,只需将其留在驱动器(记录)上就可以了,但是大多数播放器将从文件中删除已播放的块,并在流停止时将文件从驱动器和内存中清除。

我使用了来自文件存档的一些代码片段,没有压缩应用程序来处理大量文件文件处理、播放、缓冲魔术。流程的流程非常相似。如果您编写一些 sudo 代码(我强烈推荐),您可以看到相似之处。

于 2012-11-07T23:19:20.403 回答
1

我只熟悉广播流的工作原理(这将是您提到的 .pls 文件):

您下载 pls 文件,它只是一个播放列表。它的格式相当简单,因为它只是一个指向真实流所在位置的文本文件。

您可以连接到该流,因为它只是 HTTP,流 MP3 或 AAC。为了您的使用,只需将您获得的每个字节保存到一个文件中,您将获得一个 MP3 或 AAC 文件,您可以将其传输到您的 mp3 播放器。

Shoutcast 有一个可选的附加功能:元数据。你可以在这里找到它是如何工作,但并不是真正需要的。

如果您想要一个执行此操作的示例应用程序,请告诉我,我稍后会补上一些东西。

于 2010-11-22T16:05:34.433 回答