在Python中读取音频流

6 投票
1 回答
5258 浏览
提问于 2025-04-16 01:16

令人惊讶的是,在bash中,你可以这样做:

$ curl http://mp3.streampower.be/radio1-high.mp3 > test.mp3

然后按下^C退出,你就会得到一个可用的mp3文件。这让我觉得我可以用python来自动化这个过程,但我找不到方法。

如果我只是这样做:

file('python.mp3', 'w').write(urllib2.urlopen("http://mp3.streampower.be/radio1-high.mp3").read())

它甚至无法读取音频流。

在python中有没有类似于java中的BufferedInputReader的东西?或者有没有人能给我一些建议,告诉我该如何读取音频流,并在一段时间后停止读取?

谢谢!

1 个回答

9

你可能更好地保存从 urllib2.urlopen() 得到的文件对象,然后在循环中使用它的 read 方法,并设置一个大小参数:

#!/usr/bin/python

import urllib2

f=file('python.mp3', 'w')

url=urllib2.urlopen("http://mp3.streampower.be/radio1-high.mp3")

while True:
    f.write(url.read(1024))

你的代码在调用 read 时没有设置大小参数,这样就会尝试一次性读取整个内容。因为这是一个流,所以这样会花费一些时间。如果流在这个过程中关闭了,那么 你调用 write 的时候就可能会开始写入文件,这样就会从没有文件变成一个很大的文件,速度非常快。

我这里的示例代码会慢慢地帮你生成一个 mp3 文件。如果流的速度比普通的 mp3 比特率快很多,你可能需要调整一下 1024 的值,但一般来说这样设置是可以的。(一个 128kbps 的流每秒会进行 16 次系统调用来 write(2),这对系统来说压力不大。但如果速度达到 10mbit 或更高,那就会有点吃力,这时候你应该使用更大的 read 大小。)

撰写回答