在 python 中读取音频流

Posted

技术标签:

【中文标题】在 python 中读取音频流【英文标题】:Reading an audiostream in python 【发布时间】:2011-03-15 18:53:18 【问题描述】:

令人惊讶的是,在 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】:

您最好从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 的流每秒需要对 write(2) 进行 16 次系统调用,这根本不应该有任何压力。但是在 10mbit 或更高的速度下,它会受到伤害,您应该使用更大的 read 大小。)

【讨论】:

不幸的是,在我的情况下,mp3 播放效果不佳,有很多小剪辑。有什么可以帮助改进的想法吗?流在 Firefox 或 VLC 上播放良好 @Stéphane,尝试更大的块大小,10240 或更大? 实际上这可以解决问题......现在它也可以与 1024 一起使用。不明白为什么,但谢谢:-)

以上是关于在 python 中读取音频流的主要内容,如果未能解决你的问题,请参考以下文章

将音频流读取到输出设备

音频流 - 捕获和读取麦克风数据

使用一个 pyaudio 流进行数据读取和写入

Android 音频输入流

在 python 中寻找读取音频波值

Python在python / linux中拦截/读取音频输出级别